2013-02-23 64 views
5

我在做spring + hibernate的应用。当我在tomcat服务器上运行应用程序时,我收到了一些异常。以下是我的代码。java.lang.IllegalArgumentException:'sessionFactory'或'hibernateTemplate'在Spring + hibernate中是必需的

这是我的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> 

这是我的dao类。

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 

任何人都可以帮助解决这个问题。我尝试了很多,谷歌它,但没有得到解决方案。

回答

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"); 

} 
} 

或上面的代码中摆脱构造和注入 'SessionFactory的' 二传手使用injection.See org.springframework.orm.hibernate3.support.HibernateDaoSupport.setSessionFactory(SessionFactory)。我更喜欢以后的做法。

+1

我已删除重复的一个,但仍然得到该异常。并更新了这个问题。 – cherry 2013-02-23 21:02:18

+0

在你评论 – Adi 2013-02-23 21:11:21

+0

之后更新了我的答案你可以把'SessoinFactory'类的import语句吗? – 2013-02-24 16:49:39

0

我认为问题在于您在EmployeeDaoImpl中注入的SessionFactory类型与您在类中使用的SessionFactory类型不匹配。

你可以检查吗?

+1

我在dao类中使用org.hibernate.SessionFactoy – cherry 2013-02-24 17:56:42

0

这是一个老问题,所以现在必须解决,但如果有人遇到这个问题仍然存在。以下是解决方案。

您可以通过扩展HibernateDAOSupport类并覆盖其afterPropertiesSet()方法来使用Hibernate DAO支持。

此方法在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