2010-11-30 17 views
8

घोषित करने के लिए कैसे मैं अपने आवेदन Context.xml और मेरे applicationContext-test.xml में दो समान बीन्स का उपयोग कर पाता हूं। मैं अपने परीक्षण संदर्भ को अपने ऐप संदर्भ से प्राप्त करने में सक्षम होना चाहता हूं, खुद को दोहराने से बचने के लिए।अभिभावक अनुप्रयोग संदर्भ

मैंने बहुत सारी सामग्री देखी है जो दर्शाती है कि आप उस संदर्भ से अभिभावक अनुप्रयोग संदर्भ और संदर्भ बीन्स घोषित कर सकते हैं, लेकिन मुझे एक उपयोगी उदाहरण नहीं मिल रहा है। क्या कोई मदद कर सकता है?

अद्यतन कुछ पृष्ठभूमि जानकारी के रूप में, मेरे सामान्य आवेदन संदर्भ web.xml में लोड किया जा रहा है:

<context-param> 
    <description>Application Contexts for Spring</description> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/classes/applicationContext.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

मेरा परीक्षण आवेदन संदर्भ मेरी इकाई परीक्षण में लोड किया जाता है:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "/applicationContext-test.xml") 

तो मान लीजिए कि मेरे नियमित संदर्भ में एक बीन है:

<bean name="someBean" class="com.foo.MyClass" /> 

फिर, मेरे परीक्षण अनुप्रयोग संदर्भ में, मैं इस बीन का उल्लेख करना चाहता हूं। मैं यह कैसे करुं?

अद्यतन

प्रति skaffman के सुझाव, मैं एक SharedBeans.xml फ़ाइल में सेम चले गए और मेरी applicationContext.xml में आयात कर लिया। हालांकि, यह एक SAXParser अपवाद का कारण बनता है:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath:SharedBeans.xml] 
Offending resource: ServletContext resource [/WEB-INF/classes/applicationContext.xml]; nested exception is org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 1 in XML document from class path resource [SharedBeans.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'bean'. 
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68) 

मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं। बीन मेरी संदर्भ फ़ाइल में ठीक काम कर रहा था, और मैंने जो कुछ किया वह नई फाइल में कट और पेस्ट किया गया था। यहाँ अपनी संपूर्णता में SharedBeans.xml की सामग्री हैं:

<bean name="properties" class="com.foo.Properties"> 
    <constructor-arg><value>${module.name}</value></constructor-arg> 
    <constructor-arg><value>${businessUnit}</value></constructor-arg> 
    <constructor-arg><value>${product}</value></constructor-arg> 
    <constructor-arg><value>${env}</value></constructor-arg> 
    <constructor-arg><value>${machineName}</value></constructor-arg> 
    <constructor-arg><value>${collectionSet.company}</value></constructor-arg> 
    <constructor-arg><value>${route.tag}</value></constructor-arg> 
    <constructor-arg><value>${timeout}</value></constructor-arg>  
</bean> 
+1

यह इस बात पर निर्भर करता है कि आपने चीजों को कैसे सेट अप किया है। कृपया अपने संदर्भों का उपयोग करने का एक उदाहरण दें। – skaffman

+0

@skaffman: प्रश्न अपडेट किया गया। उदाहरण की सराहना की। – Samo

+2

आपको अभी भी ' 'शीर्ष-स्तरीय तत्व की आवश्यकता है .... – skaffman

उत्तर

5

यह एक माता पिता के संदर्भ के लिए एक विशेष रूप से अच्छा यूज-केस, जो मुख्य रूप से उपयोगी एक पदानुक्रम की स्थापना के लिए (उदाहरण के लिए एक जड़ है के रूप में मुझे हड़ताल नहीं करता है वेबएप संदर्भ, एकाधिक बाल सर्वलेट संदर्भ)।

आपकी स्थिति के लिए, यदि आप सामान्य बीन परिभाषाओं को एक अलग फ़ाइल में निकालें, और फिर <import> उन्हें प्रत्येक संदर्भ फ़ाइल में निकालें, तो यह समझने में आसान और आसान होगा। आप माता-पिता के संदर्भों के साथ ऐसा कर सकते हैं, लेकिन यह समझना कठिन होगा, अनावश्यक रूप से।

ठीक है, तो एक उदाहरण है, shared-beans.xml नामक एक फ़ाइल में अपने साझा सेम परिभाषा रखा, और यह अपने classpath के शीर्ष स्तर पर (अब के लिए) रखा, जिसमें: फिर

<bean name="someBean" class="com.foo.MyClass" /> 

, applicationContext-test.xml अंदर और /WEB-INF/classes/applicationContext.xml, जोड़ने निम्नलिखित:

<import resource="classpath:/shared-beans.xml" /> 

shared-beans.xml में सेम परिभाषाओं के सभी अब प्रत्येक अनुप्रयोग संदर्भ में आयात किया जाएगा। ऐसा करने से आपको तीसरा ऐप-संदर्भ नहीं मिलता है, आप बस किसी अन्य फ़ाइल से बीन परिभाषाओं को आयात करते हैं।

+1

क्या आप कृपया स्पष्टीकरण दे सकते हैं? जब आप "एक अलग फ़ाइल" कहते हैं, तो यह एक बीन कारखाना है? यदि नहीं, तो यह क्या है? आप कहते हैं कि मैं उन्हें इस फ़ाइल से आयात कर सकता हूं, लेकिन क्या आप एक उदाहरण प्रदान कर सकते हैं कि यह कैसे किया जाता है? – Samo

+0

मुझे एक SAXParser अपवाद मिल रहा है। कृपया अद्यतन प्रश्न देखें। यकीन नहीं है कि मैं गलत क्या कर रहा हूं। – Samo

0

आप अपनी आम घोषणा को अलग-अलग एक्सएमएल फ़ाइल में ले जा सकते हैं और इसे कक्षापथ में रख सकते हैं (परीक्षण से आसान पहुंच के लिए)।फिर आप निम्न कार्य कर सकते हैं:

<context-param> 
    <description>Application Contexts for Spring</description> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/classes/applicationContext.xml 
     classpath:/common-beans.xml 
    </param-value> 
</context-param> 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(
    locations = {"/applicationContext-test.xml", "common-beans.xml"}) 

तुम भी <import> का उपयोग कर दोनों संदर्भों, के रूप में skaffman ने सुझाव दिया से common-beans.xml शामिल कर सकते हैं।

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