2013-02-23 23 views
5

Sto facendo spring + hibernate apllication. Quando eseguo l'applicazione sul server tomcat sto ottenendo qualche eccezione. Di seguito è il mio codice.java.lang.IllegalArgumentException: 'sessionFactory' o 'hibernateTemplate' è richiesto in primavera + ibernazione

Questo è il file di configurazione del mio 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> 

questa è la mia classe 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"); 

    } 
} 

Qui un altro impiegato di classeBo chiama il dipendenteDaoImpl. quando eseguo questo sto ricevendo l'eccezione di seguito.

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 

Qualcuno può aiutare a risolvere questo. Ho provato molto e google pure. Ma ho trovato la soluzione.

risposta

3

Se si dispone di due file di configurazione, si duplica la definizione 'sessionFactory'. Rimuovere una delle definizioni 'sessionFactory'. Avresti ottenuto un'eccezione di definizione di bean duplicata prima di IllegalArgumentException.

Edit: Dopo il tuo commento,

public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao { 


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

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

} 
} 

o sbarazzarsi di costruttore nel codice sopra e iniettare 'sessionFactory' utilizzando setter injection.See org.springframework.orm.hibernate3.support.HibernateDaoSupport.setSessionFactory(SessionFactory). Preferisco l'approccio successivo.

+1

Ho eliminato quello duplicato ma ottenendo comunque quell'eccezione. E ha aggiornato anche la domanda. – cherry

+0

aggiornato la mia risposta dopo il commento – Adi

+0

puoi inserire l'istruzione import della classe 'SessoinFactory'? –

0

Penso che il problema sia il tipo di SessionFactory che si sta iniettando in EmployeeDaoImpl non corrisponde al tipo di SessionFactory utilizzato nella classe.

Puoi controllare?

+1

sto usando org.hibernate.SessionFactoy nella classe dao – cherry

0

Questa è una vecchia domanda, quindi deve essere risolta ora, ma se qualcuno incontra questo problema. Di seguito è la soluzione.

È possibile utilizzare il supporto DAO di Hibernate estendendo la classe HibernateDAOSupport e sovrascrivendo il suo metodo afterPropertiesSet().

Questo metodo viene chiamato nel supporto HibernateDAO e in quel momento poiché sessionFactory è nullo, viene generato questo errore. Nella vostra classe personalizzata è possibile impostare questa proprietà in modo esplicito e quindi chiamare lo stesso metodo di classe genitrice (metodo addProperties del cioè HibernateDAOSupport())

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

In seguito può essere utilizzato per sample!

Problemi correlati