2013-02-23 14 views
5

Robię wiosnę + hibernacja aplikacji. Kiedy uruchomię aplikację na serwerze Tomcat, otrzymuję wyjątek. Poniżej znajduje się mój kod.java.lang.IllegalArgumentException: "sessionFactory" lub "hibernateTemplate" jest wymagane wiosną + hibernacja

To jest mój plik konfiguracji fasoli.

<?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> 

To jest moja klasa 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"); 

    } 
} 

Oto inny pracownik klasyBo nazywa pracownikaDaoImpl. kiedy uruchamiam to otrzymuję poniżej wyjątek.

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 

Czy ktoś może pomóc rozwiązać ten problem. Próbowałem dużo i google również. Ale dostałem rozwiązanie.

Odpowiedz

3

Jeśli masz dwa pliki konfiguracyjne, duplikujesz definicję "sessionFactory". Usuń jedną z definicji "sessionFactory". Powinieneś mieć zduplikowany wyjątek definicji komponentu bean przed wyjątkiem IllegalArgumentException.

Edycja: Po Twojego komentarza,

public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao { 


public EmployeeDaoImpl(SessionFactory sessionfactory){ 
    setSessionFactory(sessionfactory); 
} 

@Override 
public List<Employee> getEmployeeDetails() { 
    return getHibernateTemplate().find("from Employee"); 

} 
} 

lub pozbyć konstruktora w powyższym kodzie i wstrzyknąć 'SessionFactory' używając setter injection.See org.springframework.orm.hibernate3.support.HibernateDaoSupport.setSessionFactory(SessionFactory). Wolę późniejsze podejście.

+1

Usunąłem duplikat, ale wciąż otrzymuję ten wyjątek. I zaktualizował również pytanie. – cherry

+0

zaktualizowałem moją odpowiedź po komentarzu – Adi

+0

czy możesz umieścić instrukcję importu klasy 'SessoinFactory'? –

0

Myślę, że problemem jest typ SessionFactory, który wstrzykujesz pod numer EmployeeDaoImpl, który nie pasuje do typu użytego w klasie SessionFactory.

Czy możesz to sprawdzić?

+1

używam org.hibernate.SessionFactoy w klasie dao – cherry

0

To stare pytanie, które należy rozwiązać teraz, ale nadal, jeśli ktoś natknie się na ten problem. Poniżej znajduje się rozwiązanie.

Możesz używać Hibernate DAO Support przez rozszerzenie klasy HibernateDAOSupport i nadpisanie jej metody afterPropertiesSet().

Ta metoda jest wywoływana w ramach obsługi HibernateDAO iw tym czasie, ponieważ sessionFactory ma wartość null, generuje ten błąd. W swojej klasie niestandardowej można jawnie ustawić tę właściwość, a następnie wywołać tę samą metodę klasy nadrzędnej (metoda addProperties tj HibernateDAOSupport za())

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(); 
    } 
} 

Obserwowany mogą być wykorzystywane do sample!

Powiązane problemy