2013-02-23 13 views
5

में वसंत + हाइबरनेट एप्लिकेशंस में 'sessionFactory' या 'hibernateTemplate' की आवश्यकता है। जब मैं टॉमकैट सर्वर पर एप्लिकेशन चलाता हूं तो मुझे कुछ अपवाद मिल रहा है। नीचे मेरा कोड है।java.lang.IllegalArgumentException: वसंत + हाइबरनेट

यह मेरी बीन कॉन्फ़िगरेशन फ़ाइल है।

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

    } 
} 

यहां एक और वर्ग कर्मचारी कर्मचारी कर्मचारी को कॉल कर रहा है। जब मैं इसे चलाता हूं मुझे नीचे अपवाद मिल रहा है।

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 से पहले डुप्लिकेट बीन परिभाषा अपवाद मिल गया होगा।

संपादित करें: अपनी टिप्पणी के बाद,

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

+0

ने – Adi

+0

पर टिप्पणी करने के बाद अपना उत्तर अपडेट किया है क्या आप 'SessoinFactory' कक्षा का आयात विवरण डाल सकते हैं? –

0

मुझे लगता है कि समस्या SessionFactory का प्रकार है जिसे आप EmployeeDaoImpl में इंजेक्शन दे रहे हैं, जो कक्षा में उपयोग किए गए SessionFactory के प्रकार से मेल नहीं खाता है।

क्या आप इसे देख सकते हैं?

+1

में ठीक से तैनाती मैं दाओ वर्ग में org.hibernate.SessionFactoy का उपयोग कर रहा हूँ – cherry

0

यह एक पुराना सवाल है, इसलिए अब हल किया जाना चाहिए लेकिन फिर भी अगर कोई इस समस्या से आता है। निम्नलिखित समाधान है।

आप हाइबरनेट डीओओ समर्थन का उपयोग HibernateDAOSupport कक्षा को विस्तारित करके और इसके बाद प्रॉपर्टीजसेट() विधि को ओवरराइड कर सकते हैं।

इस विधि को हाइबरनेट डीडीओ समर्थन में कहा जाता है और उस समय सत्र फैक्ट्री शून्य है, यह इस त्रुटि को फेंक रहा है। अपने कस्टम वर्ग में आप इस संपत्ति स्पष्ट रूप से सेट और फिर जनक कक्षा की एक ही विधि (अर्थात 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 के लिए इस्तेमाल किया जा सकता कर सकते हैं!

संबंधित मुद्दे