IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Initialisation de spring [Integration]


Sujet :

Spring Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut Initialisation de spring
    Bonjour à tous!!

    Alors voici mon problème, je commence à développer une application utilisant spring et hibernate (ainsi que tapestry mais c'est une autre histoire ^^) et j'ai quelques problèmes pour initialiser ma session :

    Voici tout d'abord les fichiers de configs hibernate & spring :

    config hibernate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
     
        	<!-- Configuration de la connexion à la base de données -->
     
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.password">root</property>
            <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/applira</property>
            <property name="hibernate.connection.username"></property>
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
     
        	  <!-- Print SQL to stdout, format it nicely  -->
     
            <property name="show_sql">true</property>
            <property name="format_sql">true</property>
            <property name="use_sql_comments">true</property>
            <property name="use_scrollable_resultset">true</property>
     
     
        	<!-- Mapping des modèles avec la table -->
     
        	<mapping class="com.applira.domain.model.Batch"/>
        	<mapping class="com.applira.domain.model.BatchMsg"/>
        	<mapping class="com.applira.domain.model.Bornes"/>
        	<mapping class="com.applira.domain.model.Instances"/>
        	<mapping class="com.applira.domain.model.IsoMsg"/>
        	<mapping class="com.applira.domain.model.Serveurs"/>
        	<mapping class="com.applira.domain.model.TypeIso"/>
        	<mapping class="com.applira.domain.model.User"/>
     
        </session-factory>
    </hibernate-configuration>
    config spring :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
     
    <!-- Application context DAO layer -->
     
    <beans>
    <!--
    		========================= Start of PERSISTENCE DEFINITIONS =========================
    	-->	
    	<!-- Hibernate sessionFactory definition  -->
    	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    		<property name="configLocation">
    			<value>classpath:hibernate.cfg.xml</value>
    		</property>
    		<property  name="configurationClass">
      			 <value>org.hibernate.cfg.AnnotationConfiguration</value>
    		</property>
    	</bean>
     
    		<!-- Hibernate Transaction Manager Definition -->
    	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory" ref="sessionFactory" />
    	</bean>
     
    		<!--
    		========================= Start of DAO DEFINITIONS =========================
    	-->
    		<!-- proxy for DAO using generic DAO -->
    	<bean id="proxyDAO" abstract="true">
    		<property name="sessionFactory" ref="sessionFactory" />
    	</bean>
     
    	<!-- userDao definition -->
    	<bean id="userDao" class="com.applira.dao.common.impl.UserDaoImpl" parent="proxyDAO">
    		<constructor-arg value="com.applira.domain.model.User" />
    	</bean>
     
     
    	<!--
    	    ========================= Start of SERVICE DEFINITIONS =========================
    	-->
    	<!-- Transactional proxy for Services -->
    	<bean id="proxyService" abstract="true"
    		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    		<property name="transactionManager" ref="transactionManager" />
    		<property name="transactionAttributes">
    			<props>
    				<prop key="find*">PROPAGATION_REQUIRED, readOnly</prop>
    				<prop key="get*">PROPAGATION_REQUIRED, readOnly</prop>
    				<prop key="*">PROPAGATION_REQUIRED, -java.lang.Exception</prop>
    			</props>
    		</property>
    	</bean>
     
    </beans>
    Sachant qu'il ne s'agit pas d'une application web donc pas de web.xml (je compte faire une appli web plus tard en incluant un jar de la présente application ^^)

    Et j'utilise pour les DAO une classe générique contenant les méthodes utiles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    package com.applira.dao.common.Impl;
     
    import com.applira.dao.common.GenericDao;
     
    import java.io.Serializable;
    import java.lang.reflect.ParameterizedType;
    import java.util.List;
     
    import org.hibernate.Criteria;
    import org.hibernate.LockMode;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.criterion.Criterion;
    import org.hibernate.criterion.Example;
    import org.springframework.orm.hibernate3.SessionFactoryUtils;
     
     
     
     
    public abstract class GenericDaoImpl<T, ID extends Serializable>
    		implements GenericDao<T, ID> {
     
    	private Class<T> persistentClass;
     
    	private SessionFactory sessionFactory;
     
    	@SuppressWarnings("unchecked")
    	public GenericDaoImpl() {
    		this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
    				.getGenericSuperclass()).getActualTypeArguments()[0];
    	}
     
    	public void setSession(SessionFactory s) {
    		this.sessionFactory = s;
    	}
     
    	protected Session getSession() {
    		boolean allowCreate = true;
            return SessionFactoryUtils.getSession(sessionFactory, allowCreate);
     
    	}
     
    	public Class<T> getPersistentClass() {
    		return persistentClass;
    	}
     
     
    	@SuppressWarnings("unchecked")
    	public T findById(ID id, boolean lock) {
    		T entity;
    		if (lock)
    			entity = (T) getSession().get(getPersistentClass(), id,
    					LockMode.UPGRADE);
    		else
    			entity = (T) getSession().get(getPersistentClass(), id);
     
    		return entity;
    	}
     
     
    	public List<T> findAll() {
    		return findByCriteria();
    	}
     
     
    	@SuppressWarnings("unchecked")
    	public List<T> findByExample(T exampleInstance, String... excludeProperty) {
    		Criteria crit = getSession().createCriteria(getPersistentClass());
    		Example example = Example.create(exampleInstance);
    		for (String exclude : excludeProperty) {
    			example.excludeProperty(exclude);
    		}
    		crit.add(example);
    		return crit.list();
    	}
     
     
    	public T makePersistent(T entity) {
    		getSession().saveOrUpdate(entity);
    		return entity;
    	}
     
     
    	public void makeTransient(T entity) {
    		getSession().delete(entity);
    	}
     
     
    	public void flush() {
    		getSession().flush();
    	}
     
     
    	public void clear() {
    		getSession().clear();
    	}
     
    	/**
             * Use this inside subclasses as a convenience method.
             */
    	@SuppressWarnings("unchecked")
    	protected List<T> findByCriteria(Criterion... criterion) {
    		Criteria crit = getSession().createCriteria(getPersistentClass());
    		for (Criterion c : criterion) {
    			crit.add(c);
    		}
    		return crit.list();
    	}
     
    }
    Et la classe UserDaoImpl sur laquelle je me base pour lancer un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    /**
     * 
     */
    package com.applira.dao.common.Impl;
     
    import org.hibernate.Criteria;
    import org.hibernate.criterion.Restrictions;
    import org.springframework.dao.DataAccessException;
    import org.apache.log4j.Logger;
    import com.applira.dao.common.UserDao;
    import com.applira.domain.model.User;
     
     
     
     
    /**
     * @author moi
     *
     */
     
    public class UserDaoImpl extends GenericDaoImpl <User, Long> implements UserDao {
     
     
    	private static Logger logger = Logger.getLogger(UserDaoImpl.class);
    	public boolean checkLogin(String nomUser, String pwd) {
    		try {
     
    			logger.info("Check user with login: "+nomUser+" and password : [PROTECTED]");
    			Criteria crit = getSession().createCriteria(User.class);
    			if (nomUser != null){
     
    				crit.add(Restrictions.ilike("nomUser", nomUser));
    			}
    			crit.add(Restrictions.eq("pwd", pwd));
     
    			User user = (User)crit.uniqueResult();
    			return (user != null);
    		}
    		catch(DataAccessException e) {
    			// Critical errors : database unreachable, etc.
    			logger.error("Exception - DataAccessException occurs : "+e.getMessage()
    					+" on complete checkLogin().");
    			return false;
    		}
    	}
     
     
     
     
    }
    Le problème est que lorsque je lance un test sur checkLogin (je vais voir en base si un user existe et que le mdp est bien celui attendu).. j'obtient ceci :

    -------------------------------------------------------------------------------
    Test set: com.atosworldine.effia.applira.common.test.UserDaoImplTest
    -------------------------------------------------------------------------------
    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.157 sec <<< FAILURE!
    testCheckLogin(com.applira.common.test.UserDaoImplTest) Time elapsed: 0.125 sec <<< ERROR!
    java.lang.IllegalArgumentException: No SessionFactory specified
    at org.springframework.util.Assert.notNull(Assert.java:112)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:283)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:202)
    at com.applira.dao.common.Impl.GenericDaoImpl.getSession(GenericDaoImpl.java:39)
    at com.applira.dao.common.Impl.UserDaoImpl.checkLogin(UserDaoImpl.java:31)
    at com.applira.common.test.UserDaoImplTest.testCheckLogin(UserDaoImplTest.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
    at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)
    Sachant que j'utilise maven et junit pour ma classe de test...

    Le problème est que je ne sais pas si cela vient :
    - De l'initialisation de spring
    - De ma classe de test (ou tout du moins si lors de la commande mvn test le contexte est bien intialisé)
    - De ma classe genericDaoImpl

    Voili voilou, a vos claviers!!! Et merci d'avance de toute réponse

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Salut l'ami !

    Tu peux nous montrer ta classe de test ?
    Le reste a l'air bon

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    Bonjour!! désolé de la lenteur de la réponse, weekend de fête oblige

    Alors voici donc la classe de tests :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package com.applira.common.test;
     
    import static org.junit.Assert.*;
     
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
     
    import com.applira.dao.common.Impl.UserDaoImpl;
     
    public class UserDaoImplTest {
     
     
    	static ApplicationContext context;
     
    	protected void setUp() throws Exception {
    	context = new ClassPathXmlApplicationContext("applicationContextDao.xml");
     
    	}
    	@Test
    	public void testCheckLogin() {
     
     
    		UserDaoImpl user = new UserDaoImpl();
    		assertTrue(user.checkLogin("pouet", "prout"));
    	}
     
    }
    Peut être est-ce le fichier applicationcontext.xml qui est mal placé... Je l'ai pourtant mis dans les ressources (src/main/ressources et src/test/ressources pour les tests)

    Merci en tout cas de s'intéresser à mon cas ^^

  4. #4
    Membre expérimenté Avatar de aymen83
    Inscrit en
    Décembre 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 271
    Par défaut
    bonjour,

    tu dois faire quelques chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserDao userDao = (UserDao) context.getBean("userDao")
    sinon ça ne marchera pas c'est parceque tu es entrain d'injecter ton session dans ton doa donc avec un new tu ne crée que le dao et non sa dépendance

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    Bonjour,

    tout d'abord merci de ta réponse, après réflexion ça doit provenir de ça, j'ais donc modifier mon test en rajoutant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserDaoImpl user = (UserDaoImpl) context.getBean("userDao");
    à la place de mon new UserDaoImpl.

    J'arrive lors du lancement du test à une nouvelle exception (un NullPointerException pour être précis) au niveau de la ligne que j'ai rajouté.

    Est-il possible que cela provienne de l'initialisation de mon contexte?

    Edit : Cela vient en effet de l'initialisation de mon contexte... la méthode setUp ne s'éxécutait pas, après avoir rajouté l'annotation @Before avant celle ci l'application charge maintenant le applicationContextdao.xml... mais je me retrouve encore avec des exceptions :

    -------------------------------------------------------------------------------
    Test set: com.applira.common.test.UserDaoImplTest
    -------------------------------------------------------------------------------
    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.907 sec <<< FAILURE!
    testCheckLogin(com.applira.common.test.UserDaoImplTest) Time elapsed: 0.859 sec <<< ERROR!
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContextDao.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.hibernate3.LocalSessionFactoryBean]: Constructor threw exception; nested exception is java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:883)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:839)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.applira.common.test.UserDaoImplTest.setUp(UserDaoImplTest.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74)
    at org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)
    Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.hibernate3.LocalSessionFactoryBean]: Constructor threw exception; nested exception is java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:115)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877)
    ... 40 more
    Caused by: java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactory
    at org.slf4j.LoggerFactory.<clinit>(LoggerFactory.java:60)
    at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:152)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:164)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.class$(LocalSessionFactoryBean.java:174)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.<init>(LocalSessionFactoryBean.java:174)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100)
    ... 42 more


  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Salut !

    En effet, quand tu utilises Junit4 avec les annotations, il faut y aller jusqu'au bout

    Ton problème m'a l'air d'être un bug de slf4j.
    Tu utilises quelle version ?
    Tu peux essayer avec une version plus récente de slf4j ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    En effet je m'était un peu emmêlé les pinceaux entre annotations et noms de méthodes

    Pour ce qui est de slf4J j'avais effectivement une différence de versions entre l'api et slf4j-simple (maven est pratique mais il faut faire attentions aux dépendances ^^)

    Donc on avance on avance!!! je n'arrive toujours pas à créer mon bean mais je lève de nouvelles exceptions ^^:
    edit : Bon le problème venait en fait du fait que je n'avais pas inclu javassist comme librairie, voila qui est donc réglé pour ce qui est des librairies (enfin j'espère ^^)

    J'ai maintenant un problème de constructeur apparemment :

    -------------------------------------------------------------------------------
    Test set: com.applira.common.test.UserDaoImplTest
    -------------------------------------------------------------------------------
    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.984 sec <<< FAILURE!
    testCheckLogin(com.applira.common.test.UserDaoImplTest) Time elapsed: 2.953 sec <<< ERROR!
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in class path resource [applicationContextDao.xml]: 1 constructor arguments specified but no matching constructor found in bean 'userDao' (hint: specify index and/or type arguments for simple parameters to avoid type ambiguities)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:181)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:925)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:835)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:440)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.applira.common.test.UserDaoImplTest.setUp(UserDaoImplTest.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74)
    at org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)
    Cela veut-il dire que je doit définir moi même un constructeur dans ma classe UserDao? Normalement le constructeur sans argument par défaut devrais marcher non? Rahhh je touche au but je le sens je le sens!!!!

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    Bon après d'intenses réflexions (si si ) le problème vient peut être de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	<constructor-arg value="com.applira.domain.model.User" />
    dans mon applicationContextDao.xml

    En effet j'ai recopié ceci d'un tuto trouvé sur le net pour l'utilisations de dao génériques avec spring. Mais ma clase user contenant plusieurs constructeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    package com.applira.domain.model;
     
    // Generated 2 juil. 2010 11:00:00 by Hibernate Tools 3.2.4.GA
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
     
    import org.hibernate.annotations.GenericGenerator;
     
    /**
     * User generated by hbm2java
     */
    @Entity
    @Table(name = "user", catalog = "applira")
    public class User implements java.io.Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = -1415175361788395512L;
    	private int idUser;
    	private String nomUser;
    	private String pwd;
     
    	public User() {
    	}
     
    	public User(int idUser) {
    		this.idUser = idUser;
    	}
     
    	public User(int idUser, String nomUser, String pwd) {
    		this.idUser = idUser;
    		this.nomUser = nomUser;
    		this.pwd = pwd;
    	}
     
    	@Id @GeneratedValue(generator="system-uuid")
        @GenericGenerator(name="system-uuid", strategy = "uuid")
    	@Column(name = "ID_USER", unique = true, nullable = false)
    	public int getIdUser() {
    		return this.idUser;
    	}
     
    	public void setIdUser(int idUser) {
    		this.idUser = idUser;
    	}
     
    	@Column(name = "NOM_USER", length = 65535)
    	public String getNomUser() {
    		return this.nomUser;
    	}
     
    	public void setNomUser(String nomUser) {
    		this.nomUser = nomUser;
    	}
     
    	@Column(name = "PWD")
    	public String getPwd() {
    		return this.pwd;
    	}
     
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
     
    }
    Est-il possible que ceci fasse bugger spring qui ne sais plus quel constructeur choisir? Et si c'est le cas comment spécifier le constructeur (sans arguments à priori)

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Ca bosse, ca bosse

    1 constructor arguments specified but no matching constructor found in bean 'userDao'
    Le problème c'est pas le constructeur de user mais celui de userDao.
    Le monsieur te dit qu'il n'y a pas de constructeur correspondant (à savoir avec un argument) trouvé dans le bean userDao

    Tu as en effet défini la création de ton bean userDao avec un user (chose assez surprenante au passage ).
    Ta classe UserDaoImpl ayant un constructeur vide, déclare le donc sans argument de constructeur dans ton bean:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean id="userDao" class="com.applira.dao.common.impl.UserDaoImpl" parent="proxyDAO"/>

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    je vais y arriver je vais y arriver grrrrr

    bon en enlevant la ligne de constructeur j'obtiens une nouvelle exception (quand yen à plus yen à encore ) :

    -------------------------------------------------------------------------------
    Test set: com.applira.common.test.UserDaoImplTest
    -------------------------------------------------------------------------------
    Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.532 sec <<< FAILURE!
    testCheckLogin(com.applira.common.test.UserDaoImplTest) Time elapsed: 0.5 sec <<< ERROR!
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDao' defined in class path resource [applicationContextDao.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'sessionFactory' of bean class [com.applira.dao.common.Impl.UserDaoImpl]: Bean property 'sessionFactory' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1279)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
    at com.applira.common.test.UserDaoImplTest.setUp(UserDaoImplTest.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74)
    at org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)
    Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'sessionFactory' of bean class [com.applira.dao.common.Impl.UserDaoImpl]: Bean property 'sessionFactory' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:801)
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:651)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:78)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1276)
    ... 40 more
    Donc apparemment j'aurais un problème avec les getter et setter... mais les getter et setter de quoi? je ne sais points ^^

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Donc apparemment j'aurais un problème avec les getter et setter... mais les getter et setter de quoi? je ne sais points ^^
    Juste un setter

    Le monsieur t'as encore aidé
    Invalid property 'sessionFactory' of bean class [com.applira.dao.common.Impl.UserDaoImpl]: Bean property 'sessionFactory' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    Ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <bean id="proxyDAO" abstract="true">
    	<property name="sessionFactory" ref="sessionFactory" />
    </bean>
    tu déclares une propriété nommée sessionFactory dans la déclaration de ton bean proxyDao, donc le monsieur (Spring) s'attend à trouver une méthode intitulée setSessionFactory() avec en paramètre un type compatible à ton bean "sessionFactory". Sauf que ta méthode a un autre non : setSession()
    allez renomme moi cette méthode qu'on passe au bug suivant !

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    En effet Monsieur spring et moi avons de gros problèmes de communications

    Bon toujours est-il qu'après avoir modifié mes getter/setters, j'ai eu droit à un magnifique.... BUILD SUCCESSFUL!!!! C'est pas beau ça? ça m'apprendras à utiliser des tutos qui ne vienne pas de développez tiens (et oui, toutes les modifications que j'ai du faire (excepté les erreurs de lib) sont du pur copier coller d'un tuto...)

    Sinon une dernière petite question dont je subodore la réponse : dans mon genericDao la partie de persistance des données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public T makePersistent(T entity) {
    		getSessionFactory().saveOrUpdate(entity);
    		return entity;
    	}
    La comme c'est codé ça ferait persister les UserDao (ou autre dao...) est-ce la bonne méthode? car j'aurais plutôt vu persister la classe User qui est la classe mappé par hibernate non?

    edit : Après essai apparemment ça marche (tout du moins ça en me ressort pas d'erreur à la compilation) par contre cela n'enregistre pas dans ma base lorsque que je test ce code dans ma classe de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UserDao userDao= (UserDao) context.getBean("userDao");
    User user = new User("Login", "password");
    userDao.makePersistent(user);
    Sur la console j'ai pourtant la bonne instruction SQl :

    Hibernate:
    /* insert com.atoswordline.effia.applira.domain.model.User
    */ insert
    into
    applira.user
    (NOM_USER, PWD)
    values
    (?, ?)
    A part les values (?,?)...

    Ais-je (encore ) oublié quelque chose ou cela vient-il du fait que c'est un test et que du coup la table serais automatiquement effacée après (j'y crois très moyennement à ça... je crois savoir qu'il faut le configurer manuellement)

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Salut Marty,

    T'as apparemment répondu à ta 1ere question (persister le user ou le dao).
    Pour la seconde, si tu n'as pas d'exceptions lors de l'appel à session.saveOrUpdate(),c'est que c'est bon signe.
    Monsieur Spring me souffle une idée : effectuer un load de ton entité suite à ton save et regarde si t'as qqch !

    Sinon tu n'utiliserais pas un rollback ou une classe de spring pour effectuer les rollback automatiquement ?
    Si c'est le ca, retire le @Transactionnal dans ta classe de test si tu veux voir qqch dans ta base après le test.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    Yop

    Hélas non je n'utilisa pas de classe spring pour faire un rollback automatique, je ne fait d'ailleur pas de rollback (pour le moment.. j'attend que au moins une classe de test marche entièrement pour ensuite commencer à passer les tests en quantité "industrielles" et donc initialiser et vider ma BDD automatiquement)

    Pour ce qui est du load je ne suis pas sur de te comprendre mais je pense que cela doit correspondre à ce que je fait dans mon test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		UserDao userDao = (UserDao) context.getBean("userDao");
    		User user = new User();
    		user.setNomUser("abc");
    		user.setPwd("abc");
    		user = userDao.makePersistent(user);
    		assertNotNull(userDao.findByLogin("abc"));
    (j'ai changé la construction de mon user pour voir si cela ne venait pas du constructeur à plusieurs arguments mais cela ne change rien...)

    par contre lorsque je tente ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public T makePersistent(T entity) {
    		getSessionFactory().saveOrUpdate(entity);
    		getSessionFactory().persist(entity);
    		return entity;
    	}
    J'obtient une belle exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    org.hibernate.PersistentObjectException: detached entity passed to persist: com.applira.domain.model.User
    	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:102)
    	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
    	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:646)
    	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:620)
    	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:624)
    	at com.applira.dao.common.impl.GenericDaoImpl.makePersistent(GenericDaoImpl.java:80)
    	at com.applira.common.test.UserDaoImplTest.testAjoutUser(UserDaoImplTest.java:47)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:585)
    	at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
    	at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
    	at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    	at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    	at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
    	at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
    	at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
    	at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    	at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    	at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
    Peut être aussi que ce code est n'importe quoi ce qui expliquerais l'exception

    edit : Ahh j'ais trouvé le load ^^ et bien ça me donne la même chose, ça me jette une exception qui me dit que mon objet n'existe pas en base...

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    J'ai un peu de mal à te suivre

    C'est assez étonnant que tu n'aies pas exception lors de la sauvegarde.
    Dans ton test, après avoir exécuté makePersistent(), affiche la valeur de getIdUser du user sauvegardé.
    Essaye de monter le niveau de log au max (trace) pour Hibernate et de voir ce qu'il passe lors de la sauvegarde.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    Humm.. de plus en plus bizarre... J'ai regardé la valeur de l'IdUser et il apparait qu'il s'incrémente au fil des tests.. ce qui est normal, c'est ce que j'attends de lui... mais encore plus bizarre, lorsque que j'ai tenté d'insérer manuellement un enregistrement dans ma base, quelle ne fut pas ma surprise de voir que l'iduser à l'intérieur de la base suivais celui ajouté dans éclipse..

    en gros en faisant mes test j'ai IdUser = 12 puis 13 puis 14 et lorsque que j'ajoute manuellement un user dans la base (qui pourtant ne contient qu'un enregistrement avec l'Id = 1, le suivant devant donc logiquement être 2)son Id est 15... Bizarre bizarre...

    Sinon pourrait tu m'expliquer pour les logs car je ne sais pas comment configurer le niveau de logs...

    Et merci de t'occuper si bien de moi ;-) J'en serais encore au stade de l'arrachage de cheveux sinon ^^

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    238
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2009
    Messages : 238
    Par défaut
    Humpf le boulet... j'avais juste oublié d'insérer cette petite ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="connection.autocommit">true</property>
    Dans mon fichier de conf hibernate...

    Forcément si je ne commit pas ça marche beaucoup moins bien

    Donc a yé!!! problème résolue!!! Je n'ai plus qu'a continuer mon application jusqu'au prochain bug

    Merci de ta précieuse aide en tout cas ^^

  18. #18
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Salut !!

    Merci de ta précieuse aide en tout cas ^^
    De rien

    Bravo, tu sais mieux parler à monsieur Hibernate qu'à monsieur Spring

    Je connaissais pas ce paramétrage Merci !

    En général, je laisse Spring faire les auto-commit à ma place en dehors des transactions.
    HibernateTemplate t'aide bien en ce sens, et il t'offre aussi pas mal d'autres services ;-)

    Pour le logging, c'est assez simple.
    Je vais te donner un exemple, ca pourra toujours t'aider

    T'as plusieurs api pour cela.
    Avec log4j, Il te faut l'api log4j dans le classpath ainsi qu'un fichier intitulé log4j.properties ou log4j.xml également dans ton classpath.
    Un exemple de log4.properties, tiré du site log4j. Je l'ai un tout petit peu modifié pour montrer comment voir les logs d'Hibernate de niveau DEBUG (dernière ligne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    log4j.rootLogger=INFO, A1
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
     
    # Print the date in ISO 8601 format
    log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
     
    # Print only messages of level WARN or above in the package org.hibernate
    log4j.logger.org.hibernate=DEBUG
    Bon courage pour la suite Jedi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Framework] Exception à l'initialisation de spring
    Par chahrazedd dans le forum Spring
    Réponses: 2
    Dernier message: 22/07/2011, 00h40
  2. probleme avec l'initialisation de spring
    Par bousnguar dans le forum Spring
    Réponses: 4
    Dernier message: 19/08/2008, 12h59
  3. Initialisation JPA par Spring
    Par Alwin dans le forum JPA
    Réponses: 3
    Dernier message: 05/12/2007, 14h48
  4. [RCP] Initialisation Spring Client Riche
    Par tatemilio2 dans le forum Spring
    Réponses: 1
    Dernier message: 19/09/2006, 08h52
  5. [Hibernate][Spring] Session Hibernate initialisée
    Par mauvais_karma dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/08/2005, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo