我正在做spring + hibernate apllication。当我在tomcat服务器上运行应用程序时,我遇到了一些异常。以下是我的代码。
这是我的bean配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>WEB-INF/database/db.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>Employee.hbm.xml</value>
</list>
</property>
</bean>
<bean id="employeeBo" class="com.saggezza.employee.bo.impl.EmployeeBoImpl">
<property name="employeeDao" ref="employeeDao" />
</bean>
<bean id="employeeDao" class="com.saggezza.employee.dao.impl.EmployeeDaoImpl">
<constructor-arg ref="sessionFactory"></constructor-arg>
</bean>
这是我的道教课程。
public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao {
private SessionFactory sessionFactory;
public EmployeeDaoImpl(SessionFactory sessionfactory){
this.sessionFactory=sessionfactory;
}
@Override
public List<Employee> getEmployeeDetails() {
return getHibernateTemplate().find("from Employee");
}
}
这里有另一个类employeeBo正在调用employeeDaoImpl。 当我运行这个时,我得到了以下异常。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeBo' defined in ServletContext resource [/WEB-INF/spring/EmployeeBean.xml]: Cannot resolve reference to bean 'employeeDao' while setting bean property 'employeeDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeDao' defined in ServletContext resource [/WEB-INF/spring/EmployeeBean.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
任何人都可以帮忙解决这个问题。我已经尝试了很多并谷歌它。但确实得到了解决方案。
答案 0 :(得分:3)
如果您有两个配置文件,则复制'sessionFactory'定义。删除其中一个'sessionFactory'定义。在IllegalArgumentException之前你会遇到重复的bean定义异常。
编辑:发表评论后,
public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao {
public EmployeeDaoImpl(SessionFactory sessionfactory){
setSessionFactory(sessionfactory);
}
@Override
public List<Employee> getEmployeeDetails() {
return getHibernateTemplate().find("from Employee");
}
}
或删除上面代码中的构造函数,并使用setter注入注入'sessionFactory'。请org.springframework.orm.hibernate3.support.HibernateDaoSupport.setSessionFactory(SessionFactory)
。我更喜欢后来的方法。
答案 1 :(得分:0)
我认为问题是SessionFactory
注入的EmployeeDaoImpl
类型与您在课堂上使用的SessionFactory
的类型不匹配。
你能查一下吗?
答案 2 :(得分:0)
这是一个老问题,所以现在必须解决,但如果有人遇到这个问题仍然存在。以下是解决方案。
您可以通过扩展HibernateDAOSupport类并覆盖其afterPropertiesSet()方法来使用Hibernate DAO Support。
在HibernateDAO支持中调用此方法,此时由于sessionFactory为null,因此抛出此错误。在您的自定义类中,您可以显式设置此属性,然后调用父类的相同方法(即HibernateDAOSupport的addProperties()方法)
package com.techcielo.spring4.hibernate.template;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
@Component("hibernateTemplate")
public class Hibernate4CustomTemplate extends HibernateTemplate{
@Autowired(required=true)
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
System.out.println("Setting SessionFactory");
this.sessionFactory = sessionFactory;
super.setSessionFactory(sessionFactory);
}
@Override
public void afterPropertiesSet() {
System.out.println("Checking if properties set..."+this.sessionFactory);
setSessionFactory(sessionFactory);
super.afterPropertiesSet();
}
}
以下内容可用于sample!
答案 3 :(得分:0)
我遇到了同样的问题,并通过将Autowired
的构造函数与EntityManagerFactory
一起使用来解决。 Keyur的答案是正确的
@Service
class EmployeeDaoImpl @Autowired constructor(
factory: EntityManagerFactory
) : HibernateDaoSupport(), EmployeeDao {
init {
if (factory.unwrap(SessionFactory::class.java) == null) {
throw NullPointerException("factory is not a hibernate factory")
}
setSessionFactory(factory.unwrap(SessionFactory::class.java))
}
...
}