2013-02-23 50 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

相關問題