2011-12-21 22 views
8

का उपयोग कर स्प्रिंग बीन परिभाषा फ़ाइल आयात करने में असमर्थ मैं वसंत के लिए नया हूं और एक स्प्रिंग प्रोजेक्ट विरासत में मिला जिसमें प्रोजेक्टनाम/वेबकंटेंट/वेब-आईएनएफ/applicationContext.xml में सभी एक्सएमएल कॉन्फ़िगरेशन थे। मैं कॉन्फ़िगरेशन को विभिन्न घटकों में तोड़ने की कोशिश कर रहा हूं, इसलिए परीक्षण करते समय डेटा स्रोतों और हाइबरनेट कॉन्फ़िगरेशन जैसी चीजों को प्रतिस्थापित करना आसान है।सापेक्ष पथ

यहाँ मेरी फ़ाइल संरचना है:

ProjectName 
    ->WebContent 
     ->WEB-INF 
      ->applicationContext.xml 
      ->spring-datasource.xml 
      ->spring-hibernate-properties.xml 
      ->spring-persistence.xml 
    ->test 
     ->us.mn.k12... (Java pkgs with JUnit tests) 
     ->spring-hsqldb-datasource.xml 
     ->spring-test-bean-locations.xml 
     ->spring-test-hibernate-properties.xml 
    ->src 
     ->us.mn.k12... (Java pkgs with production code) 

वेब-INF/applicationContext.xml में, मैं निम्नलिखित आयात:

<import resource="spring-datasource.xml"/> <!-- Production datasource --> 
<import resource="spring-hibernate-properties.xml"/> <!-- Production hibernate properties --> 
<import resource="spring-persistence.xml"/> <!-- DAO's, hibernate .hbm.xml mapping files --> 

आवेदन ऊपर विन्यास के साथ काम करता है।

मेरा जुनीट परीक्षण डीबीयूनीट और एचएसक्यूएलडीबी इन-मेमोरी डेटाबेस का उपयोग करके चलाया जाता है। तो मेरी JUnit परीक्षण संदर्भ वसंत परीक्षण-सेम के locations.xml है, जो निम्नलिखित है:

<import resource="spring-hsqldb-datasource.xml"/> <!-- HSQLDB datasource for test --> 
<import resource="../WebContent/WEB-INF/spring-persistence.xml"/> <!-- Production DAO's, hibernate .hbm.xml mapping files --> 
<import resource="spring-test-hibernate-properties.xml"/> <!-- Hibernate properties for test --> 

इस तरह, मैं परीक्षण डेटा स्रोत निर्दिष्ट करें और गुण हाइबरनेट, लेकिन डीएओ के लिए उत्पादन मैपिंग फ़ाइल का पुन: उपयोग कर सकते हैं, आदि। हालांकि, मुझे अपने जुनीट परीक्षण चलाने में त्रुटि मिली है।

Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from relative location [../WebContent/WEB-INF/spring-persistence.xml] 
Offending resource: class path resource [spring-test-bean-locations.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [../WebContent/WEB-INF/spring-persistence.xml]; nested exception is java.io.FileNotFoundException: class path resource [../WebContent/WEB-INF/spring-persistence.xml] cannot be opened because it does not exist 

अब अगर मैं/परीक्षण में वसंत-persistence.xml ले जाने के लिए इतना है कि मैं रिश्तेदार पथ का उपयोग करने की जरूरत नहीं है, और <import resource="spring-persistence.xml"/> साथ इसे संदर्भ है, तो परीक्षण: यहाँ अपवाद के प्रासंगिक हिस्सा है ठीक चलाओ तो मुझे लगता है कि मेरी एक्सएमएल फाइलों की सामग्री ठीक है, लेकिन मैं एक सापेक्ष पथ के साथ ठीक तरह से आयात नहीं कर रहा हूं।

क्या कुछ स्पष्ट है कि मैं अपने सापेक्ष पथ के आयात के साथ गलत कर रहा हूं? और शायद बड़ा सवाल यह है कि यह परीक्षण के लिए आसान बनाने के लिए applicationContext.xml को घटकों में तोड़ने के लिए उचित रणनीति की तरह दिखता है?

धन्यवाद!

उत्तर

18

समस्या यह है कि: वेब-आईएनएफ के अंदर कुछ भी नियमित परियोजना सेटअप में क्लासलोडर के लिए उपलब्ध नहीं है (और वसंत संसाधनों तक पहुंचने के लिए डिफ़ॉल्ट रूप से क्लासलोडर का उपयोग करता है)। इस के आसपास काम करने के लिए कुछ हैक हैं (जैसे फ़ाइल का उपयोग कर संदर्भों का संदर्भ देना: उपसर्ग), लेकिन वे अधिकतर बदसूरत हैं।

एक बेहतर अभ्यास मैं सुझाव दूंगा कि संदर्भ फ़ाइलों को वेब-आईएनएफ से बाहर ले जाएं और एक समर्पित संसाधन निर्देशिका (स्रोत/मुख्य/संसाधन यदि आपके पास मेवेन सेटअप है) में स्थानांतरित करना है। इस तरह वे वेबपैड क्लासलोडर और स्थानीय यूनिट टेस्ट क्लासलोडर्स दोनों के लिए उपलब्ध होंगे।

शामिल तंत्र को और समझने के लिए resources chapter पढ़ें।

+1

स्पष्टीकरण शॉन के लिए धन्यवाद। हम चींटी का उपयोग कर रहे हैं और केवल हमारे प्रोजेक्ट की जड़ पर 3 नोड्स के रूप में src, test, और WebContent/WEB-INF हैं। प्रोडक्शन स्प्रिंग एक्सएमएल फाइलों को स्रोत निर्देशिका में डालना होगा, और परीक्षा परीक्षण में स्प्रिंग एक्सएमएल परीक्षण एक सामान्य सेटअप होगा? या अन्य स्थान आमतौर पर गैर-मेवेन सेटअप में उपयोग किए जाते हैं। धन्यवाद! – buck64

+0

@ buck64 हाँ, वह करेगा। मेवेन में संसाधनों से अलग वर्गों को रखने के लिए एक सम्मेलन है, लेकिन क्लासलोडर के लिए यह वही है। –

+0

यदि यह मामला है तो यह कैसे संभव हो सकता है कि मेरे जार (सेम के साथ) /applications/Foo.ear/FooWebApp में रखा गया हो।युद्ध/वेब-आईएनएफ/lib और सब कुछ काम करता है! – voipp

11

उपयोग

<import resource="file:**/WebContent/WEB-INF/spring-persistence.xml" /> 

यह वसंत 3.2.1.RELEASE में काम करता है। पुराने संस्करण मुझे यकीन नहीं है।

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