Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required at org.springframework.orm.hibernate3.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:118) at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 36 more
原因:
我的pageDaoImpA继承了org.springframework.orm.hibernate3.support.HibernateDaoSupport, spring在初始化容器的时候会对这个对象作一个check, 可以看看HibernateDaoSupport源码中的checkDaoConfig()方法
protected final void checkDaoConfig()
{
if (this.hibernateTemplate == null)
throw new IllegalArgumentException("'sessionFactory' or 'hibernateTemplate' is required");
}
我的结构是PageDaoImpA继承 HibernateDaoSupport.因为HibernateDaoSupport里需要用到SessionFactory或hibernateTemplate
<bean id="pageDao" class ="com.lft.daoImp.PageDaoImpA">
<!-- hibernateDaoSupport需要注入sessionFactory或hibernateTemplate -->
<property name="hibernateTemplate" ref="hibernateTemplate"> </property>
</bean>
上面的配置就把SessionFactory注入进去了。
现在我使用的是注解, DaoSupport中需要这样才能成功注入SessionFactory
@Transactional//具有默认的事务行为
public abstract class PageDaoImpA extends HibernateDaoSupport implements DAO {
/**
* 【注入 SessionFactory】
* 注入一个sessionFactory属性,并注入到父类(HibernateDaoSupport )里
*/
private SessionFactory sessionFacotry;
//注入一个bean, 默认(name = "sessionFactory"), 因此只写@Resource
@Resource
public void setSessionFacotry(SessionFactory sessionFacotry) {
super.setSessionFactory(sessionFacotry);
}
//省略非重点代码...
}
以上代码可能有误:
public class BaseDao extends HibernateDaoSupport{
@Resource(name="sessionFactory")
public void setSuperSessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
}