2012-01-19 18 views
19

में एकाधिक गुण फ़ाइलें मैं कई अलग-अलग मॉड्यूल के साथ एक परियोजना पर काम कर रहा हूं, प्रत्येक में अपने स्वयं के अनुप्रयोग संदर्भ गुण फ़ाइलें हैं। मैं इन सभी गुणों को लोड करने में सक्षम होना चाहता हूं ताकि वे स्प्रिंग द्वारा प्लेसहोल्डर रिज़ॉल्यूशन के लिए उपयोग किए जा सकें।स्प्रिंग 3.0

पिछला सवाल यह उल्लेख किया है और वहाँ एक अच्छा ब्लॉग पोस्ट here का वर्णन करता है कि कैसे, प्रत्येक संदर्भ में एक PropertyPlaceholderConfigurer का उपयोग प्राथमिकता के आधार पर उन्हें ऑर्डर और सच करने के लिए ignoreUnresolveablePlaceholders सेट इतना है कि इन गुणों फ़ाइलों उड़ाने के बिना संदर्भ पार कर सकते हैं एक दूसरे के लिए है अप।

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

जहां तक ​​मेरा बता सकते हैं, संभावित समाधान हैं:

1) मर्ज सभी गुण एक गुण सेम में दायर। यह तो, (वसंत के आंतरिक प्लेसहोल्डर संकल्प के लिए) एक PropertyPlaceholderConfigurer और (मेरे अपने प्लेसहोल्डर संकल्प के लिए) एक PropertyPlaceholderHelper के साथ प्रयोग किया

2) किसी भी तरह के गुण का सेट, और उनके पदानुक्रमित व्यवस्था उपयोग करने के लिए एक PropertyPlaceholderHelper कॉन्फ़िगर बनाने के लिए इस्तेमाल किया जा सकता है यदि मैं आगे बढ़ता हूं और उस ब्लॉग पोस्ट की सलाह का पालन करता हूं तो PropertyPlaceholdConfigurers द्वारा आयोजित किया जाता है।

दुर्भाग्य से मैं इनमें से किसी एक को कैसे काम नहीं कर सकता। किसी भी तरह की सहायता का स्वागत किया जाएगा!

पीएस ऐसा लगता है कि स्प्रिंग 3.1 यहां एक बड़ी मदद होगी ... दुर्भाग्यवश हम अभी तक इसे स्थानांतरित करने के लिए तैयार नहीं हैं इसलिए मुझे अभी भी मुझे ज्वार करने के लिए एक समाधान की आवश्यकता है!

**** संपादित ****

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

प्रश्न यह है कि कोर मॉड्यूल में परिभाषित मौजूदा गुण फ़ाइलों में गैर-कोर मॉड्यूल में परिभाषित गुण फ़ाइलों को कैसे विलय करना है। फिलहाल मैं एक बीनपोस्टप्रोसेसर के साथ आगे बढ़ रहा हूं - मैं बस सोच रहा हूं कि ऐसा करने के लिए एक आसान/अधिक सुरुचिपूर्ण तरीका है?

धन्यवाद

+0

मुझे लगता है कि आपको कम से कम एक स्थिर डीआईआर सेगमेंट प्रदान करने की आवश्यकता है, इसलिए 'क्लासपाथ *: *। गुण' काम नहीं करेगा लेकिन 'classpath *: config/*। Properties' होगा। – mrembisz

उत्तर

7

कोड स्निपेट के बाद मिलता है आप

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="corePlaceHolder"> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="searchSystemEnvironment" value="true"/> 
    <property name="locations"> 
     <list> 
      <value>classpath*:config/*/config1/*.properties</value> 
      <value>classpath*:config/*/config2/*.properties</value> 
      <value>classpath*:config/*/config3/*.properties</value> 
      <value>classpath*:custom.properties</value> 
     </list> 
    </property> 
</bean>  
शुरू कर दिया जाना चाहिए

आप पदानुक्रम निम्नलिखित यकीन है कि config बनाने में संपत्ति फ़ाइलों को स्टोर कर सकते हैं classpath के माध्यम से से

config 
    config1 
    a.properties 
    config2 
    b.properties 
    config3 
    c.properties 
custom.properties 
9

आप एकत्र कर सकते हैं पहुंचा जा सकता है कई संपत्ति फ़ाइलों को एक बीन में आसानी से आसानी से:

<bean id="allProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="singleton" value="true"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="locations"> 
    <list> 
     <value>classpath*:default.properties</value> 
     <value>classpath*:overrides.properties</value> 
     <value>file:${APP_HOME}/**/*.properties</value> 
    </list> 
    </property> 
</bean> 

यह विशेष उदाहरण सभी डिफ़ॉल्ट.प्रोपर्टीज, ओवरराइड एकत्र करेगा।आपके APP_HOME में क्लासपाथ और प्रॉपर्टी फ़ाइलों पर गुण। अब आप ProperyPlaceholderConfigurer या अपने कस्टम पोस्टप्रोसेसर से इस बीन का उल्लेख कर सकते हैं।

<context:property-placeholder location="first.properties" order="0" ignore-unresolvable="true"/> 
<context:property-placeholder location="second.properties" order="0" ignore-unresolvable="true"/> 
<context:property-placeholder location="empty.properties" order="1"/> 

समस्या सरल है:: यह एक अपवाद है, भले ही अन्य संपत्ति-प्लेसहोल्डर मौजूद हैं फेंक अगर एक संपत्ति-प्लेसहोल्डर एक निश्चित संपत्ति के लिए कोई मूल्य नहीं है,

6

यह तुम सब करने की जरूरत है ।

समाधान order का उपयोग करता है पता करने के लिए जो पिछले property-placeholder है और अन्य सभी पर ignore-unresolvable="true" सेट, ताकि हर property-placeholder एक मूल्य प्रदान करने के लिए मौका है। बहु-मॉड्यूल परियोजनाओं में अंतिम property-placeholder खाली हो सकता है या विफलता-डिफ़ॉल्ट प्रदान कर सकता है।

नोट: यदि आप सभी संपत्ति-प्लेसहोल्डर को ignore-unresolvable="true" पर सेट करते हैं तो स्प्रिंग केवल अपवाद फेंकने के बिना आपने जो लिखा है उसे पारित करेंगे। यदि आप निश्चित रूप से String के अलावा कुछ और होने की उम्मीद करते हैं तो आपको प्रारूप रूपांतरण के दौरान java.lang.NumberFormatException: For input string: "${something}" जैसे निश्चित रूप से एक धोखा मिलेगा।

नोट: सिर्फ पहले (न्यूनतम के साथ एक order) property-placeholder विशिष्ट संपत्ति के लिए एक मूल्य के साथ इस्तेमाल किया जाएगा। यदि आप गुणों को ओवरराइड करना चाहते हैं तो अधिक order0 और 1 या property-override से अधिक का उपयोग करें।

वसंत 3.2.1 के साथ परीक्षण किया गया, लेकिन सभी उल्लिखित गुण 3.0 में मौजूद हैं। देखें JavaDoc of PropertyPlaceholderConfigurer

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