2016-04-02 7 views
0

У меня есть этот Maven проект с его модулямиSPRING MVC - IllegalArgumentException: 'SessionFactory' или 'hibernateTemplate' требуется

Parent

| _____ Модель

| _____ Постоянство

 |_ persistence-context.xml 

| _____Сервис

 |_ service-context.xml 

| _____ Посмотреть

 |_ spring/app-config.xml 

И инерционности-context.xml имеют следующий:

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 = "кличка">

<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> 

В этом xml я делаю свои daos с ним sessionFactory, но когда я запускаю проект, я получил java.lang.IllegalArgumentException: «sessionFactory» или «hibernateTemplate» требуется, потому что мой hibernateTemplate равен null. My daos простирается от HibernateDaoSupport, и я знаю, что если вы дадите вашему dao sessionFactory, он автоматически создаст hibernateTemplate и idk, что может произойти.

Мои DAOS имеют @Repository (пример @Repository (значение = "servicioDao"))

И те услуги @Service с @Autowired в инкубаторе

и я добавляю их в Contex

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

Я просто добавить это в инерционности-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> 

я получаю ту же ошибку.

Некоторые из моего 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; 
} 
} 

ответ

1

Я заметил, что когда я использую @Service и @Repository, beans arent, созданный xml, поэтому, когда он дал мне ошибку, «sessionFactory» или «hibernateTemplate» требуется », было связано с тем, что dao был создан, но не был заполнен его sessionFactory, поэтому для использования моих файлов xml я создал контроллер, как обычный компонент

0

Попробуйте изменить определение боба для этого:

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

Это означает, что вы передаете в SessionFactory в конструкторе класса DAO.

Вы также должны написать полный проход в своем параметре «класс».

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

Далее в вашем DAO класса написать что-то вроде этого:

@Repository 
public class ServicioDao{ 
    private SessionFactory sessionFactory; 

    public ServicioDao() { 

    } 

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

    ... 
    ... 
} 

Наконец, в контроллерах, вы можете использовать класс DAO следующим образом:

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

Обратите внимание, что не нужно делать new ServicioDao();.

Сделайте это для каждого класса DAO.

+0

Привет! Это не сработало :(и я не могу поставить autwired в setSession cus, что этот метод из HibernateDaoSupport и является окончательным. Спасибо :) – evilkorona

+0

Как я могу позволить большему количеству людей увидеть мой вопрос? – evilkorona

+0

IllegalArgumentException выбрано, чтобы указать, что метод был передан незаконным или несоответствующим аргументом .... тогда это означает, что каким-то образом ваши параметры не проходят к вашим классам DAO (или в этом случае вводятся). Можете ли вы показать код одного из ваших классов DAO? –

 Смежные вопросы

  • Нет связанных вопросов^_^