SPRING MVC - IllegalArgumentException:' sessionFactory'或者' hibernateTemplate'是必须的

时间:2016-04-02 22:53:33

标签: java spring-mvc repository autowired sessionfactory

我有这个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"        默认自动装配="绰号">

<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中我使用sessionFactory制作了我的daos,但是当我启动项目时,我得到了java.lang.IllegalArgumentException:&#39; sessionFactory&#39;或者&#39; hibernateTemplate&#39;是必需的,因为我的hibernateTemplate为null。 我的daos扩展自HibernateDaoSupport,我知道如果你给你的dao一个sessionFactory它将自动创建一个hibernateTemplate,并且idk可能发生的事情。

我的daos有一个@Repository(例子@Repository(value =&#34; servicioDao&#34;))

在服务器中使用@Autowired服务@Service服务

我正在上下文中添加它们

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

我得到了同样的错误。

我的一些代码:

@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;
}
}

2 个答案:

答案 0 :(得分:1)

我注意到当我使用@Service和@Repository时,bean不是由xml创建的,所以当它给我错误时“'sessionFactory'或'hibernateTemplate'是必需的”是因为dao已创建但从未填充其sessionFactory,所以为了使用我的xml文件,我创建了像普通bean一样的控制器

答案 1 :(得分:0)

尝试更改您的bean定义:

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

这意味着您在DAO类的构造函数中传递sessionFactory。

你还必须在你的&#34;类&#34;中写下完整的传球。参数。

<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课程做。