问题描述:在spring和hibernate集成时,需要在dao实现层中注入sessionFactory,但是启动报错:Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required。明明已经注入了,但是却还报这个错。而且之前的都是使用注解注入,都没问题。排查了几个来回,还是报错,最后都怀疑人生了。
注入如下:
@Resource
public void setSessionFacotry(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}
排查过程:几经周折,最终先理了一遍spring对bean的管理流程,注解方式和xml方式思路大体一样,我使用的是注解,所以简单写一下注解方式:1.先在spring的配置文件中启动注解扫描,且配置需要扫描的包,多个包中间用逗号隔开。2.service层实现类上贴上spring注解(可用@Component,@Service),并且写上实例名,用接口名首字母些小。3.dao层实现类上贴上注解(可用@Component,@Repository),并且写上实例名,用接口名首字母些小。4.dao实现类里注入sessionFactory。(dao实现继承了hibernate的hibernateDaoSupport类)
确认了以上流程没问题后,又仔仔细细地分析了一遍报错信息。找到感觉最有价值的错误信息如下:
[ERROR] [2019-10-16 10:24:01.067] [RMI TCP Connection(2)-127.0.0.1] [](ContextLoader.java:331) Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ocxxxxxxService' defined in URL [jar:file:/D:/Develop/Tomcats/idea_tomcat/apache-tomcat-7.0.78/webapps/CommonXXX/WEB-INF/lib/CommonService-2.0.jar!/com/xx/xxx/service/impl/OcxxxxxxServiceImpl.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554) ~[spring-beans-4.0.7.RELEASE.jar:4.0.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
最终定位在service层上出了问题。马上回去查看service层代码,发现如下:
最终报错原因:居然在service层继承了dao层,而此dao继承了hibernateDaoSupport,所以在启动时,需要注入sessionFactory。
总结:头脑不清醒时,禁止敲代码!不然就会犯非常低级的错误!!!