2011-06-17 14 views
5

को प्रॉपर्टी जोड़ें मैं एक आवेदन जहां एक संपत्ति प्लेसहोल्डर, कॉन्फ़िगर गुण को पढ़ने के लिए प्रयोग किया जाता है applicationContext.xml में है:संपत्ति प्लेसहोल्डर

... 
<context:property-placeholder 
    location="classpath*:META-INF/spring/*.properties"/> 
... 

आवेदन एक बिलाव में चलता है और पैरामीटर context.xml में परिभाषित का उपयोग करता है। एप्लिकेशन सामान्य पैरामीटर (@Value(${cfma.applicationUrl})) जैसे इस पैरामीटर तक पहुंचता है। यह काम करता है

मेरे परीक्षण मामलों में मेरे पास यह tomcat गुण नहीं है, इसलिए मैं उन्हें एप्लिकेशन संदर्भ में "मैन्युअल" जोड़ना चाहता हूं। लेकिन यह भी सामान्य applicationContext.xml

testContext.xml लोड:

<import resource="classpath:/META-INF/spring/applicationContext.xml" /> 
<context:property-placeholder properties-ref="simulatedTomcatProperties"/> 
<util:properties id="simulatedTomcatProperties"> 
    <prop key="cfmt.applicationBaseUrl">localhost:8080/cfmt</prop> 
</util:properties> 
अब मैं दो संदर्भ है

: संपत्ति-प्लेसहोल्डर है और इस (बेशक) काम नहीं करता है - तो मेरी सवाल है, मैं कौन विस्तार कर सकते हैं मेरे परीक्षण में "सामान्य" संपत्ति-प्लेसहोल्डर में गुण?


अधिक मैं क्या जरूरत का स्पष्टीकरण:

  • (विकास के वातावरण के साथ-साथ) उत्पादक पर्यावरण बिलाव पैरामीटर के माध्यम से कुछ गुण परिभाषित करता है। इसलिए वे किसी भी गुण फ़ाइल में शामिल नहीं हैं, लेकिन तंत्रिका रहित उन्हें सामान्य गुणों (@Value(${cfma.applicationUrl})) तक पहुंचा जा सकता है। इसके अलावा कोई फॉलबैक नहीं होना चाहिए, अगर गुणों को टॉमकैट में परिभाषित नहीं किया गया है, तो एप्लिकेशन शुरू नहीं होना चाहिए!
  • परीक्षण मामलों में (जो वसंत संदर्भ का उपयोग करते हैं) मुझे कुछ संपत्ति (cfma.applicationUrl) डालने चाहिए ताकि इसे एनोटेटेड चर में इंजेक्शन दिया जा सके। लेकिन अगर मैं एक दूसरे context:property-placeholder जोड़ने वे विलय कर रहे हैं नहीं: https://jira.springsource.org/browse/SPR-4881 पर

@See टिप्पणियाँ - वे कहते हैं कि व्यवहार की व्याख्या।


जब मैं बिलाव पैरामीटर मैं somethink के बारे में इस तरह बात कर रहा हूँ के बारे में बात:

context.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <Parameter name="cfmt.applicationBaseUrl" 
      value="http://localhost/demoApp" override="false"/> 
</Context> 
+0

http://stackoverflow.com/questions/6375016/spring-properties-file-setting-default-values ​​देखें इसे प्रभावी ढंग से आप कई संपत्तियां हैं स्थानों परिभाषित करने के लिए अनुमति देता है। गुम गुण फ़ाइलों को अनदेखा किया जाता है, और सूचीबद्ध अंतिम वैध फ़ाइल लोड हो जाती है। – Fil

+0

@ फिलिप: मेरा प्रश्न एकाधिक स्थान के बारे में नहीं है। मैं एकाधिक संपत्ति प्लेसहोल्डर कॉन्फ़िगरर के साथ अटक गया। और मैं अपने test-context.xml – Ralph

+0

क्षमा से "सामान्य" ऐप संदर्भ संपत्ति प्लेसहोल्डर कॉन्फ़िगरर की कॉन्फ़िगरेशन को बढ़ाने/बदलने का एक तरीका ढूंढ रहा हूं। मेरी टिप्पणी बहुत स्पष्ट नहीं थी, मैं एकाधिक गुण फ़ाइलों को निर्दिष्ट करने का एक तरीका नहीं सुझा रहा था, लेकिन सशर्त गुण लुकअप करने का एक तरीका था। एक विस्तारित उत्तर नीचे है। – Fil

उत्तर

5

सुनिश्चित नहीं हैं कि अगर इस में मदद मिलेगी, लेकिन, सेकंड/परीक्षण/संसाधनों में एक ही नाम के साथ 2 app.properties फ़ाइलें क्या मैं एक ऐसी ही स्थिति में क्या है और दूसरा स्रोत/मुख्य/संसाधनों में। अब परीक्षण के दौरान पहले लोड किया गया है क्योंकि टेस्ट क्लास क्लासपाथ पर पहले हैं, लेकिन जब मैं केवल मुख्य तैनाती करता हूं तो वहां होता है और इसलिए यह लोड होता है।

+0

क्योंकि मेरी समस्या अतिरिक्त गुणों से संबंधित है मेरे कामकाज परीक्षण/संसाधनों (मेवेन बेस परियोजना) में मेरे परीक्षणों के लिए एक अतिरिक्त गुण फ़ाइल है। – Ralph

+0

हां, मैं दो फाइलों में डुप्लिकेट गुणों को समाप्त करता हूं! –

3

यह अगर तुम context:property-placeholder परिभाषित करने के लिए एक ही location विशेषता जोड़ने काम करता है testContext.xml में applicationContex.xml में परिभाषित एक में है? META-INF से नीचे उन लोगों को ओवरराइड करने के लिए आपको local-override="true" विशेषता जोड़ने की आवश्यकता होगी।

संपादित करें:

अपने सबसे हाल ही टिप्पणी को देखते हुए, मुझे लगता है कि आप context नाम स्थान का उपयोग कर छोड़ और सीधे स्प्रिंग वस्तुओं है कि पर्दे के पीछे का उपयोग करता है का उपयोग करने की आवश्यकता होगी। शायद कुछ इस तरह:

applicationContext.xml में:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath*:META-INF/spring/*.properties" /> 
</bean> 

TestContext में।xml:

<bean id="propertyConfigurerTest" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" parent="propertyConfigurer"> 
    <property name="properties" ref="simulatedTomcatProperties" /> 
    <property name="localOverride" value="true" /> 
</bean> 
<util:properties id="simulatedTomcatProperties"> 
    <prop key="cfmt.applicationBaseUrl">localhost:8080/cfmt</prop> 
</util:properties> 

मेरा अनुमान है कि आप तो मैं localOverride सच के रूप में परिभाषित स्थानीय गुण गुण classpath संसाधनों से परिभाषित ओवरराइड करना चाहते।

+0

कोई दुर्भाग्य से यह मदद नहीं करता है। जैसा कि मैंने समझा, मुझे लगता है कि समस्या यह है कि यदि मेरे पास दो 'संदर्भ हैं: संपत्ति-प्लेसहोल्डर' निश्चितताएं मुझे संपत्ति धारक को भी संपत्ति मिलनी है, और विलय नहीं हुआ है। – Ralph

+0

मुझे उम्मीद है कि 'testContext.xml' में से एक' applicationContext.xml' में से एक को ओवरराइड करेगा यदि यह 2 लोड हो गया है।आप क्या गलत व्यवहार देख रहे हैं? – laz

+0

गलत नहीं है, यह उम्मीद की जाती है (कि यह दो संदर्भों के साथ काम नहीं करता है: संपत्ति-प्लेसहोल्डर)। व्यवहार यह है कि क्षेत्र @Value ($ {cfma.applicationUrl}) एनोटेटेड फ़ील्ड में परीक्षण नहीं किया गया है। - मैं अपने testContext.xml में applicationContex.xml से संपत्ति-प्लेसहोल्डर को "विस्तारित" करने का एक तरीका खोज रहा हूं। – Ralph

3

यदि आपके मुख्य एप्लिकेशन Context.xml में, आप PropertiesFactoryBean का उपयोग करके नीचे सूचीबद्ध के रूप में कई संपत्ति लुकअप निर्दिष्ट करते हैं, तो किसी भी मिस्ड गुण फ़ाइल लोड नहीं होती हैं, और अंतिम सफलतापूर्वक लोड की गई प्रॉपर्टी फ़ाइल का उपयोग किया जाता है। आपके मामले में, default.properties (जैसे आपकी परीक्षण गुण फ़ाइल) लोड हो जाएगी, और क्योंकि दूसरी फ़ाइल: $ {catalina} ... लोड नहीं की जाएगी, आपके @Value फ़ील्ड्स को डिफ़ॉल्ट रूप से निर्दिष्ट मानों के साथ इंजेक्शन दिया जाएगा। गुण।

उत्तर here से लिया:

<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="locations"> 
     <list> 
     <value>classpath:default.properties</value> 
     <value>file:${catalina.home}/webapps/myProperties.properties</value> 
     </list> 
    </property> 
</bean> 
+0

तो आपके सुझाव का अंतर और '<संदर्भ: संपत्ति-प्लेसहोल्डर स्थान =" वर्गपाथ *: मेटा-आईएनएफ/वसंत/* गुण "/>' इतना नहीं है। - कम से कम आप परीक्षण के लिए अतिरिक्त गुण फ़ाइल रखने का सुझाव देते हैं - है ना? – Ralph

+0

बिल्कुल। और आप अपनी जरूरतों से अधिक निकटता से मिलान करने के लिए PropertiesFactoryBean भी बढ़ा सकते हैं; मैं इसका उपयोग करने के लिए अलग-अलग कॉन्फ़िगरेशन फ़ाइलों को लोड करने में मदद करता हूं (उदाहरण के लिए जेएनडीआई का उपयोग लुकअप के लिए, या स्थानीय एच 2 डेटाबेस का उपयोग करके, डीबीयूनीट के साथ बीजिंग, आदि ...) – Fil

1

मैं दो फ़ाइलों में applicationContext.xml ऊपर विभाजित करके समस्या का समाधान: - applicationContext.xml - "सामान्य" सेम शामिल है, लेकिन कोई की applicationContext-properties.xml में शामिल हैं - applicationContext-properties.xml -

applicationContext-properties.xml शामिल संपत्ति प्लेसहोल्डर config:

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
     <property name="locations" value="classpath*:META-INF/spring/*.properties" /> 
     <property name="ignoreUnresolvablePlaceholders" value="false" /> 
</bean> 

वेब अनुप्रयोग भार दोनों स्टार्टअप पर फ़ाइलें:

web.xml: simulatedTomcat.test-properties कि सभी बिल्ला गुण शामिल हैं:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value> 
</context-param> 

मेरी परीक्षण के लिए मैं एक propoperties फ़ाइल जोड़ लिया है। ध्यान दें: जो इस फ़ाइल गुण द्वारा इस्तेमाल किया पैटर्न से मेल नहीं खाता प्लेसहोल्डर applicationContext-properties.xml

की configurer तो मैं एक गुण अपने परीक्षण है कि लोड दोनों तरह सेशन गुण फ़ाइलें (*.properties और *.test-properties)

के लिए configurer प्लेसहोल्डर है test-context.xml

<import resource="classpath:/META-INF/spring/applicationContext.xml" /> 
<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
     <value>classpath*:META-INF/spring/*.properties</value> 
     <value>classpath*:META-INF/spring/*.test-properties</value> 
     </list> 
    </property> 
</bean> 
संबंधित मुद्दे