今天自己在applicationXXX.xml配置文件中注入了一个实例,部署后重启tomcat时候抛错了,错误正是标题。我研究了好久,因为是参照之前注入成功的实例去注入的,怎么就出问题了呢?后来在网上查到,是因为我这个实例比较特殊:MemberDaoImpl extends HibernateDaoSupport implements MemberDao
就是因为集成了HibernateDaoSupport 这个,凡事继承这个的,都要在注入文件里面添加:<property name="sessionFactory" ref="sessionFactory"></property>
完整的部分是: <bean id="memberDao" class="cn.payeasy.user.service.impl.MemberDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
以下是网上的:
- <bean id="userDAO" class="org.bookstore.dao.impl.UserDAO">
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
- <bean id="userService" class="org.bookstore.service.impl.UserService">
- <property name="userDAO">
- <ref bean="userDAO"/>
- </property>
- </bean>
<bean id="userDAO" class="org.bookstore.dao.impl.UserDAO">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userService" class="org.bookstore.service.impl.UserService">
<property name="userDAO">
<ref bean="userDAO"/>
</property>
</bean>
- public class UserDAO extends HibernateDaoSupport implements IUserDAO {
- public void saveUser(User user) {
- ......
- }
- }
public class UserDAO extends HibernateDaoSupport implements IUserDAO {
public void saveUser(User user) {
......
}
}
修改后如下:
- <bean id="userDAO" class="org.bookstore.dao.impl.UserDAO">
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
- <bean id="userService" class="org.bookstore.service.impl.UserService">
- <property name="userDAO">
- <ref bean="userDAO"/>
- </property>
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
<bean id="userDAO" class="org.bookstore.dao.impl.UserDAO">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userService" class="org.bookstore.service.impl.UserService">
<property name="userDAO">
<ref bean="userDAO"/>
</property>
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
原因:
我的org.bookstore.dao.impl.UserDAO继承了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");
- }
- }
- protected final void checkDaoConfig() {
- if (this.hibernateTemplate == null) {
- throw new IllegalArgumentException("'sessionFactory' or 'hibernateTemplate' is required");
- }
- }
protected final void checkDaoConfig() {
if (this.hibernateTemplate == null) {
throw new IllegalArgumentException("'sessionFactory' or 'hibernateTemplate' is required");
}
}
所以,在com.lfw.sh.manager.impl.UserManageImpl对象一定要注入一个sessionFactory or hibernateTemplate对象。
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- org.hibernate.dialect.MySQLDialect
- </prop>
- </props>
- </property>
- <property name="mappingResources">
- <list>
- <value>org/bookstore/model/User.hbm.xml</value>
- ....
- </list>
- </property>
- </bean>