2011-01-27 9 views
8

एक प्रोजेक्ट सेट अप करने का प्रयास कर रहे हैं लेकिन स्प्रिंग के माध्यम से ऑटोवॉयरिंग ऑब्जेक्ट्स में विफल हो जाते हैं।@Autowired ऑब्जेक्ट्स शून्य मान प्राप्त कर रहे हैं

package se.hsr.web; 

public class TestRunner { 

    public static void main(String[] args) { 
     ContactDAO cd = new ContactDAOImpl(); 
     Contact contact = new Contact(); 
     contact.setFirstname("Zorro"); 
     cd.addContact(contact); 
    } 

} 

package se.hsr.web; 

इसे चलाने से मुझे cd.addContact लागू होने पर एक NullPointerException देता है। ContactDaoImpl:

import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 

@Repository 
public class ContactDAOImpl implements ContactDAO { 

    @Autowired 
    private SessionFactory sessionFactory; 

    public void addContact(Contact contact) { 
     sessionFactory.getCurrentSession().save(contact); 
    } 

मेरे सर्वलेट फ़ाइल:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan 
     base-package="se.hsr.web"/> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/jsp/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
     p:location="/WEB-INF/jdbc.properties" /> 

    <bean id="dataSource" 
     class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" 
     p:driverClassName="${jdbc.driverClassName}" 
     p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" 
     p:password="${jdbc.password}" /> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configLocation"> 
      <value>classpath:hibernate.cfg.xml</value> 
     </property> 
     <property name="configurationClass"> 
      <value>org.hibernate.cfg.AnnotationConfiguration</value> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="contactDAOImpl" 
     class="se.hsr.web.ContactDAOImpl"/> 

    <context:annotation-config/> 

</beans> 

मेरे hibernate.cfg.xml फ़ाइल:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory> 
     <mapping class="se.hsr.web.Contact" /> 
    </session-factory> 

</hibernate-configuration> 

मेरे web.xml फ़ाइल:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 
    <display-name>HSRMVC</display-name> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <servlet> 
     <servlet-name>HSR</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>HSR</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

मुझे लगता है कि त्रुटि वें है सत्र फ़ैक्टरी पर @Autowired के माध्यम से शुरू नहीं किया जा रहा है, लेकिन वह क्यों है? क्या यह एक साधारण निर्देशिका संरचना/फ़ाइलपैथ समस्या हो सकती है या यह कुछ और जटिल है?

अग्रिम धन्यवाद।

अद्यतन: ContactDAOImpl वर्ग:

@Repository 
public class ContactDAOImpl extends HibernateDaoSupport implements ContactDAO{ 

    @Autowired 
    @Qualifier("sessionFactory") 
    private SessionFactory sessionFactory; 

    public void addContact(Contact contact) { 
     sessionFactory.getCurrentSession().save(contact); 
    } 
+0

के संभावित डुप्लिकेट के साथ ContactDAOImpl व्याख्या द्वारा "मैन्युअल" instanciate के लिए, आप इसे ठीक कर सकते, सक्षम होना चाहते हैं [क्यों मेरी स्प्रिंग @Autowired फ़ील्ड रिक्त है ?] (http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null) – chrylis

उत्तर

14

स्प्रिंग फीचर्स (ऑटोवायरिंग, निर्माण विधियों या पहलुओं को पोस्ट करने के लिए कॉल) का उपयोग करने के लिए आपको स्प्रिंग को new का उपयोग करने के बजाय इंस्टेंस को इंस्टेंट करने की आवश्यकता है।

उदाहरण के लिए:

public static void main(String[] args) { 
    ApplicationContext context = AnnotationConfigApplicationContext("se.hsr.web") 
    ContactDAO cd = (ContactDAO)context.getBean("contactDAOImpl"); 
    Contact contact = new Contact(); 
    contact.setFirstname("Zorro"); 
    cd.addContact(contact); 
} 

AnnotationConfigApplicationContext स्प्रिंग एनोटेशन के साथ कक्षाओं के लिए करने के लिए se.hsr.web पैकेज में कक्षाओं में कक्षाओं को स्कैन करेगा। इसके लिए स्प्रिंग 3.0 काम करने की आवश्यकता है।काम करने के लिए

xmlns:context="http://www.springframework.org/schema/context" 
.... 
<context:annotation-config/> 
+0

बहुत बहुत धन्यवाद, लेकिन यह @Autowired एनोटेशन का उपयोग नहीं कर रहा है यह? क्या ऑटोवर्किंग का उपयोग करके यह काम करने का कोई और तरीका है? –

+1

@Emil - यह @Autowired का उपयोग कर रहा है। मुद्दा यह है कि निर्भरता स्वाभाविक हैं, लेकिन इसके लिए रूट ऑब्जेक्ट (ContactDao) को वसंत-प्रबंधित होने की आवश्यकता है। यदि आप स्पष्ट रूप से नए का उपयोग करते समय वसंत को स्वस्थ करना चाहते हैं, तो @ कॉन्फ़िगर करने योग्य एनोटेशन में देखें। – GaryF

+0

स्पष्टीकरण के लिए धन्यवाद! अब मुझे NoSuchBeanDefinitionException मिलता है: निर्भरता के लिए कोई प्रकार का मिलान बीन [org.hibernate.SessionFactory] नहीं मिला: कम से कम 1 बीन अपेक्षित है जो इस निर्भरता के लिए ऑटोवायर उम्मीदवार के रूप में अर्हता प्राप्त करता है। निर्भरता एनोटेशन: {@ org.springframework.beans.factory.annotation.Autowired (आवश्यक = सत्य), @ org.springframework.beans.factory.annotation.Qualifier (value = sessionFactory)}। अब, जैसा कि आप एचएसआर-सर्वलेट.एक्सएमएल में देख सकते हैं, सत्र फैक्ट्री बीन घोषित किया गया है। इसके अलावा मैंने अपने डीएओआईएमपीएल के साथ मूल पोस्ट अपडेट किया, जो मुझे सही लगता है? मैं क्या खो रहा हूँ? –

0

आप वसंत संदर्भ से ContactDAO उदाहरण पुनः प्राप्त करने की जरूरत है। आप new कीवर्ड के साथ स्वयं को जोड़ रहे हैं।

नीचे दिए गए लिंक को देखें;

@Autowired annotation not able to inject bean in JUnit class

या

ClassPathResource resource = new ClassPathResource("beans.xml"); 
BeanFactory factory = new XmlBeanFactory(resource); 
beanFactory.getBean("nameOfYourBean"); 

http://static.springsource.org/spring/docs/2.0.x/reference/beans.html

+0

क्या आप इसका मतलब बता सकते हैं कि मुझे यह कैसे करना चाहिए? मैंने testAunner में ContactAO को @Autowired ContactDAO contactDAO में बदलने की कोशिश की; लेकिन यह मुझे एक NullPointerException भी दे दिया। –

+0

बस लिंक देखा, इसे बहुत पढ़ा जाएगा धन्यवाद। –

2

आप अपने परीक्षण वर्ग के शीर्ष पर इस की जरूरत है इकाई परीक्षण नहीं करता है, तो:

@RunWith(SpringJUnit4ClassRunner.class) 
// ApplicationContext will be loaded from "/applicationContext.xml" and "/applicationContext-test.xml" 
// in the root of the classpath 
@ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-test.xml"}) 
public class MyTest { 

मैं JUnit4 मान लिया; मेरी निगरानी

आपको किसी संदर्भ संदर्भ में संदर्भ कॉन्फ़िगरेशन टैग की आवश्यकता है, लेकिन मुझे आपके कोड में कहीं भी नहीं दिखाई देता है जहां आप वास्तव में एप्लिकेशन संदर्भ फ़ाइल खोल रहे हैं और एप्लिकेशन कॉन्टेक्स्ट बना रहे हैं। आमतौर पर यह आपके परीक्षण के लिए एक सेट अप विधि में किया जाता है। यदि आप वास्तव में कहीं एप्लिकेशन कॉन्टेक्स्ट बनाते हैं तो आपको बेहतर भाग्य मिलेगा। एक सेटअप विधि में अपने क्लासस्पैट से एक्सएमएल पढ़ने का प्रयास करें और देखें कि क्या इससे मदद मिलती है।

+0

मुझे खेद है कि मेरी कक्षा भ्रामक थी, यह वास्तव में एक टेस्टक्लास नहीं है, केवल टेस्टरुनर नामक एक वर्ग जिसे मैंने कार्यक्षमता को आजमाने के लिए बनाया है। क्या @Context कॉन्फ़िगरेशन चीज लागू होती है? –

+0

नहीं, आपको माइकल बोर्गवार्ट के उत्तर प्रति संदर्भ.xml में की आवश्यकता है। – sourcedelica

+0

संपादित स्प्रिंग कॉन्फ़िगरेशन फ़ाइल के लिए मेरी मूल पोस्ट देखें। समस्या अभी भी बनी हुई है। –

1

आप अपने स्प्रिंग विन्यास में इस की जरूरत है: कि इससे पहले कि आप अपने applicationContext.xml फ़ाइल में निम्न पंक्ति जोड़ना चाहिए।

+0

मैंने अपने वसंत-कॉन्फ़िगरेशन को संपादित करने का प्रयास किया, लेकिन समस्या बनी रहती है। मैंने अपनी मूल पोस्ट को नई कॉन्फ़िगरेशन के साथ संपादित किया है। –

+0

@Emil: ठीक है, यही कारण है कि ऑटोवॉयरिंग मेरे लिए असफल हो गई, लेकिन मुझे लगता है कि अन्य कारण भी हैं। –

1

डीएओ/DAOImpl को @Component/@Repository जोड़े autowiring के लिए

<context:component-scan base-package="se.hsr.web" /> 
1

आप वसंत संदर्भ के बाहर POJO बना रहे हैं।

यदि आप वास्तव में आपके विन्यास को <context:spring-configured /> जोड़ने, और फिर @Configurable

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