SPRING MVC — IllegalArgumentException: требуется «sessionFactory» или «hibernateTemplate»

У меня есть этот проект maven с его модулями

Родитель

|_____Модель

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

     |_ persistence-context.xml

|_____Сервис

     |_ service-context.xml

|_____Просмотр

     |_ spring/app-config.xml

А в persistence-context.xml есть следующее:

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://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>

In that xml i make my daos with it sessionFactory, but when i startup the project i got java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required, because my hibernateTemplate is null. My daos extends from HibernateDaoSupport and i know that if you give to your dao a sessionFactory it will create automatically an hibernateTemplate, and idk what could be happening.

В моих даосах есть @Repository (пример @Repository(value="servicioDao"))

И сервисы @Service с @Autowired в установщике

и я добавляю их в контекст

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

Я просто добавляю это в файл persistence-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;
}
}

person evilkorona    schedule 02.04.2016    source источник


Ответы (2)


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

person evilkorona    schedule 06.04.2016

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

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

person Luis Teijon    schedule 02.04.2016
comment
Привет!! Это не сработало :( и я не могу поставить autowired в setSession, потому что этот метод взят из HibernateDaoSupport и является окончательным. Спасибо :) - person evilkorona; 03.04.2016
comment
Как я могу позволить большему количеству людей увидеть мой вопрос? - person evilkorona; 03.04.2016
comment
IllegalArgumentException генерируется, чтобы указать, что методу был передан недопустимый или неподходящий аргумент... тогда это означает, что каким-то образом ваши параметры не передаются в ваши классы DAO (или вводятся в этом случае). Можете ли вы показать код одного из ваших классов DAO? - person Luis Teijon; 03.04.2016
comment
Привет! Это не сработало, я лучше увидел ошибку и думаю, что она не использует xml. Причина: bean-компонент с именем «servicioDao», определенным в URL-адресе [jar:file:/G:/workspace/. . . unqui.tip.persistencia-0.0.1-SNAPSHOT.jar!/daos/ServicioDao.class] просто указывает на класс, и я не устанавливаю там фабрику сеансов, только в xml. - person evilkorona; 03.04.2016