2009-03-26 12 views
50

मैं एक दिया प्रणाली संपत्ति के अनुसार एक विशिष्ट applicationContext.xml फ़ाइल को लोड करने की जरूरत है। यह स्वयं वास्तविक विन्यास के साथ एक फ़ाइल लोड करता है। इसलिए मुझे 2 PropertyPlaceHolderConfigurer की आवश्यकता है, जो सिस्टम पैरामीटर को हल करता है, और दूसरा वास्तविक कॉन्फ़िगरेशन के भीतर।क्या मेरे एप्लिकेशन कॉन्टेक्स्ट में एकाधिक PropertyPlaceHolderConfigurer होना संभव है?

कोई भी विचार है कि यह कैसे करना है?

+0

मुझे आश्चर्य है कि क्या आप अंत परिणाम प्राप्त करने की कोशिश कर रहे हैं, इसके बारे में थोड़ा और विस्तार कर सकते हैं? – krosenvold

उत्तर

71

हाँ आप एक से अधिक कर सकते हैं। ignoreUnresolvablePlaceholders सेट करना सुनिश्चित करें ताकि पहले किसी भी प्लेसहोल्डर्स को अनदेखा कर सकें जो इसे हल नहीं कर सकता है।

<bean id="ppConfig1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="locations"> 
    <list> 
      <value>classpath*:/my.properties</value> 
    </list> 
    </property> 
</bean> 

<bean id="ppConfig2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreUnresolvablePlaceholders" value="false"/> 
    <property name="locations"> 
    <list> 
      <value>classpath*:/myOther.properties</value> 
    </list> 
    </property> 
</bean> 

आपके आवेदन के आधार पर आप systemPropertiesMode की जाँच करनी चाहिए, तो यह आपको एक फ़ाइल से गुण लोड करने के लिए अनुमति देता है, लेकिन सिस्टम गुण संपत्ति फाइल में मूल्यों को भी पार करने के लिए करता है, तो सेट अनुमति देते हैं।

+5

ट्रेंटन की चेतावनी देखें - (jira.springsource.org/browse/SPR-6428) - यदि दूसरे पीपीसी में लोड की गई संपत्तियां पहले पीपीसी में लोड की गई संपत्तियों पर भरोसा करती हैं, तो यह काम नहीं करेगी! – ihadanny

+0

क्या यह कोड स्निपेट 'spring-servlet.xml' या' application-context.xml' के अंदर है ??? –

7

खबरदार - वहाँ कई configurers से संबंधित एक बग हो सकता है। अधिक जानकारी के लिए http://jira.spring.io/browse/SPR-5719 देखें।

मैं स्थानीय रूप से काम करने के लिए एकाधिक प्राप्त करने में असमर्थ हूं ... लेकिन मैं अभी तक किसी को भी दोष नहीं दे रहा हूं।

+2

दाएं, https://jira.springsource.org/browse/SPR-6428 देखें - यदि दूसरे पीपीसी में लोड की गई संपत्तियां पहले पीपीसी में लोड की गई संपत्तियों पर भरोसा करती हैं, तो यह काम नहीं करेगी! – ihadanny

+0

मैंने एकाधिक प्रॉपर्टीप्लेसहोल्डर कॉन्फ़िगरर के साथ एक और बग पर ट्राइप किया: https://jira.spring.io/browse/SPR-9989। @ वैल्यू ("$ {property: default}") एनोटेशन केवल पहले पीपीसी का उपयोग करते हैं, और यदि यह संपत्ति प्रदान नहीं करता है तो इसके लिए डिफ़ॉल्ट मान का उपयोग किया जाता है। जवाब के लिए –

6

एक और समाधान PropertyPlaceholdConfigurer की प्लेसहोल्डर प्राइफिक्स प्रॉपर्टी का उपयोग करना है। आप इसे दूसरे (तीसरे, चौथे ...) कॉन्फ़िगरर के लिए निर्दिष्ट करते हैं, और फिर अपने सभी संबंधित प्लेसहोल्डर्स को उपसर्ग करते हैं, इस प्रकार कोई संघर्ष नहीं होगा।

<bean id="mySecondConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
     p:location="classpath:/myprops.properties" 
     p:placeholderPrefix="myprefix-"/> 

<bean class="com.mycompany.MyClass" p:myprop="${myprefix-value.from.myprops}"/> 
+2

धन्यवाद यह मदद की। सिर्फ एक चीज - मेरे मामले में मुझे '$ अपलोडर {' और प्रत्यय '}' जैसे उपसर्ग निर्दिष्ट करना पड़ा। इसलिए मुझे $ अपलोडर {key.from.file} का उपयोग करके गुण मिलते हैं। आपका समाधान चुपचाप फाइल से मेरी संपत्ति नहीं मिल रहा था। – freakman

3

आप इस सीधे नहीं कर सकते, और वसंत से इस JIRA मुद्दा बताता है कि क्यों (एक विस्तृत विवरण के लिए क्रिस बीम से टिप्पणी की जांच):

https://jira.springsource.org/browse/SPR-6428

हालांकि, वह प्रदान करता है है जो एक वैकल्पिक हल स्प्रिंग 3.1 या बाद का उपयोग कर, PropertyPlaceholderConfigurer वर्ग के बजाय PropertySourcesPlaceholderConfigurer वर्ग का उपयोग करने के। जारी नंबर, एसपीआर-6428, डाउनलोड की गई परियोजनाओं में के लिए

https://github.com/SpringSource/spring-framework-issues

देखो:

आप एक Maven आधारित परियोजना है कि समस्या और स्प्रिंग ढांचे मुद्दों GitHub से समाधान को दर्शाता है डाउनलोड कर सकते हैं।

<util:properties id="defaultProperties"> 
    <prop key="stand.name">DEV</prop> 
    <prop key="host">localhost</prop> 
</util:properties> 
<context:property-placeholder 
    location="file:${app.properties.path:app.properties}" 
    properties-ref="defaultProperties"/> 

सिस्टम संपत्ति app.properties.path कॉन्फ़िग फ़ाइल के लिए पथ ओवरराइड करने के लिए इस्तेमाल किया जा सकता:

0

हम निम्नलिखित दृष्टिकोण काम कर रहे है।

और एप्लिकेशन प्लेसहोल्डर्स के लिए कुछ डिफ़ॉल्ट मानों को बंडल करता है जिन्हें सामान्य मॉड्यूल में डिफ़ॉल्ट के साथ परिभाषित नहीं किया जा सकता है।

2

मेरे अपने पक्ष पर, दोनों गुण PropertyPlaceholderConfigurer के साथ खेल:

  • आदेश (प्रथम पहुँचा/पार्स पीपीसी के लिए कम होना चाहिए)
  • ignoreUnresolvablePlaceholders ("गलत" पहले पहुँचा के लिए/पार्स पीपीसी, " सच "अगले एक के लिए)

  • और भी 2 अलग आईडी (रों) दोनों पीपीसी (एक से बचने के लिए देने के लिए अन्य द्वारा अधिलेखित हो करने के लिए)

काम करता है पूरी तरह से

आशा है कि यह

0

सिर्फ 2 अलग आईडी मेरे लिए काम किया देने में मदद करता है। मैं वसंत 3.0.4 का उपयोग कर रहा हूँ।

उम्मीद है कि मदद करता है।

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