2016-04-02 5 views
0

Je possède ce projet Maven avec ses modulesSpring MVC - IllegalArgumentException: 'sessionFactory' ou 'HibernateTemplate' est nécessaire

Parent

| _____ Modèle

| _____ persistance

 |_ persistence-context.xml 

| _____Service

 |_ service-context.xml 

| _____ Voir

 |_ spring/app-config.xml 

Et dans la persistance context.xml ont la prochaine:

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsd " default- autowire = "byName">

<tx:annotation-driven transaction-manager="persistence.transactionManager" proxy-target-class="true" /> 

<bean id="persistence.propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath*:META-INF/jdbc.properties</value> 
      <value>classpath*:META-INF/hibernate.properties</value>    
     </list> 
    </property> 
</bean> 

<bean id="persistence.transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="persistence.sessionFactory" /> 
    <property name="jdbcExceptionTranslator" ref="persistence.jdbcExceptionTranslator" /> 
</bean> 

<bean name="persistence.jdbcExceptionTranslator" class="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator"> 
    <constructor-arg> 
     <ref bean="persistence.dataSource" /> 
    </constructor-arg> 
</bean> 

<bean id="persistence.dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.db.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="poolPreparedStatements" value="true" /> 
    <property name="initialSize" value="20" /> 
    <property name="maxActive" value="30" /> 
    <property name="maxIdle" value="25" /> 
</bean> 

<bean id="persistence.sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="persistence.dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> 
      <prop key="hibernate.connection.autocommit">false</prop> 
      <prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop> 
     </props> 
    </property> 
    <property name="mappingLocations"> 
     <list> 
      <value>classpath:mappings/items/servicio.hbm.xml</value> 
      <value>classpath:mappings/items/stockable.hbm.xml</value> 
      <value>classpath:mappings/items/bigstockable.hbm.xml</value>   
     </list> 
    </property> 
</bean> 

<!-- Daos beans --> 

<bean id="servicioDao" class="daos.ServicioDao" > 
    <property name="sessionFactory" ref="persistence.sessionFactory" /> 
</bean> 
<bean id="stockableDao" class="daos.StockableDao" > 
    <property name="sessionFactory" ref="persistence.sessionFactory" /> 
</bean> 
<bean id="bigStockableDao" class="daos.BigStockableDao" > 
    <property name="sessionFactory" ref="persistence.sessionFactory" /> 
</bean> 

Dans ce fichier xml je crée mon daos avec sessionFactory, mais quand je lance le projet java.lang.IllegalArgumentException: 'sessionFactory' ou 'hibernateTemplate' est requis, car mon hibernateTemplate est null. Mes daos s'étendent de HibernateDaoSupport et je sais que si vous donnez à votre dao un sessionFactory, il créera automatiquement un hibernateTemplate, et idk ce qui pourrait arriver.

Mes daos ont un @Repository (exemple @Repository (valeur = "servicioDao"))

Et les services du @service avec le @Autowired dans le poseur

et je les ajoute dans la Contex

<context:component-scan base-package="controllers" /> 
    <context:component-scan base-package="servicios" /> 
    <context:component-scan base-package="daos" /> 

j'ajouter ceci dans la persistance context.xml

<!-- Daos beans --> 

<bean id="servicioDao" class="daos.ServicioDao" > 
    <property name="sessionFactory" ref="persistence.sessionFactory" /> 
    <property name="hibernateTemplate" ref="hibernateTemplate" /> 
</bean> 
<bean id="stockableDao" class="daos.StockableDao" > 
    <property name="sessionFactory" ref="persistence.sessionFactory" /> 
    <property name="hibernateTemplate" ref="hibernateTemplate" /> 
</bean> 
<bean id="bigStockableDao" class="daos.BigStockableDao" > 
    <property name="sessionFactory" ref="persistence.sessionFactory" /> 
    <property name="hibernateTemplate" ref="hibernateTemplate" /> 
</bean> 

je reçois la même erreur.

Certains de mon code daos:

@Repository(value="servicioDao") 
@SuppressWarnings("serial") 
public class ServicioDao extends GenericHome<Servicio>{ 
public ServicioDao(){} 
@Override 
protected Class<Servicio> getDomainClass() { 
return Servicio.class; 
} 
} 
public abstract class GenericHome<T> extends HibernateDaoSupport implements  Serializable{ 
protected Class<T> persistentClass = this.getDomainClass(); 
protected abstract Class<T> getDomainClass(); 
} 
public class ServicioService { 
private ServicioDao servicioDao; 
public ServicioService(){} 
public ServicioDao getServicioDao() { 
return servicioDao; 
} 
@Autowired 
public void setServicioDao(ServicioDao servicioDao) { 
this.servicioDao = servicioDao; 
} 
} 

Répondre

1

J'ai remarqué que lorsque j'utilise @Service et @Repository, les beans ne sont pas créés par le xml, alors quand il m'a donné l'erreur "'sessionFactory' ou 'hibernateTemplate' est nécessaire" parce que le dao a été créé mais jamais rempli sa sessionFactory, donc pour utiliser mes fichiers xml j'ai créé le contrôleur comme un haricot normal

0

Essayez de changer vos définitions de haricots pour cela:

<bean id="servicioDao" class="daos.ServicioDao" > 
     <constructor-arg> 
      <ref bean="persistence.sessionFactory" /> 
     </constructor-arg> 
</bean> 

Cela signifie que vous passez le sessionFactory dans le constructeur de votre classe de DAO.

Vous devez également écrire le passage complet dans votre paramètre "class".

<bean id="servicioDao" class="full.package.path.to.ServicioDao" > 

Ensuite, dans votre classe DAO écrire quelque chose comme ceci:

@Repository 
public class ServicioDao{ 
    private SessionFactory sessionFactory; 

    public ServicioDao() { 

    } 

    /** 
    * Constructor. 
    * 
    * @since 1.0 
    */ 
    public ServicioDao(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    ... 
    ... 
} 

Enfin, dans vos contrôleurs, vous pouvez utiliser la classe DAO comme suit:

... 
@Autowired 
ServicioDao servicioDao; 
... 
servicioDao.getServicioDao(); 

Notez que vous n'a pas besoin de faire new ServicioDao();.

Faites-le pour chaque classe DAO.

+0

Salut !! Il n'a pas fonctionné :(et je ne peux pas mettre autowired dans setSession cus cette méthode est de HibernateDaoSupport et est finale Merci – evilkorona

+0

Comment puis-je laisser plus de gens voir ma question? – evilkorona

+0

IllegalArgumentException est levé pour indiquer qu'une méthode a été passée un argument illégal ou inapproprié .... alors cela signifie que d'une manière ou d'une autre vos paramètres ne sont pas passés à vos classes DAO (ou injectées, dans ce cas). Pouvez-vous montrer le code d'une de vos classes DAO? –