कई परियोजनाओं / मॉड्यूल में कई संपत्ति फ़ाइलों (PropertyPlaceholderConfigurer के माध्यम से) का उपयोग करना


104

हम वर्तमान में एक एप्लिकेशन लिख रहे हैं जो कई प्रोजेक्ट्स / मॉड्यूल में विभाजित है। उदाहरण के लिए, चलिए निम्नलिखित मॉड्यूल लेते हैं:

  • MyApp-डीएओ
  • MyApp-अस्पष्ट

प्रत्येक मॉड्यूल की अपनी स्प्रिंग संदर्भ xml फ़ाइल होती है। DAO मॉड्यूल के लिए मेरे पास एक PropertyPlaceholderConfigurer है जो आवश्यक db कनेक्शन मापदंडों के साथ एक संपत्ति फ़ाइल पढ़ता है। जैबर मॉड्यूल में मेरे पास प्रॉपर्टीप्लेसहॉल्डरकॉन्फिगर जब्बार कनेक्शन संपत्तियों के लिए भी है।

अब मुख्य एप्लिकेशन आता है जिसमें myApp-DAO और myApp-jabber शामिल हैं। यह सभी संदर्भ फ़ाइलों को पढ़ता है और एक बड़ा स्प्रिंग संदर्भ शुरू करता है। दुर्भाग्य से ऐसा लगता है कि प्रति संदर्भ में केवल एक प्रॉपर्टीहोल्डरकॉन्फिगरर हो सकता है, इसलिए जो भी पहले लोड किया जाता है, वह कनेक्शन मापदंडों को पढ़ने में सक्षम है। अन्य एक त्रुटि के साथ एक अपवाद को फेंक देता है जैसे "प्लेसहोल्डर 'jabber.host' को हल नहीं कर सका"

मैं एक तरह से समझता हूं कि समस्या क्या है, लेकिन मैं वास्तव में एक समाधान नहीं जानता - या मेरे usecase के लिए सबसे अच्छा अभ्यास।

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

मैं stackoverflow समुदाय से समाधान / विचारों के बारे में सुनने के लिए उत्सुक हूँ ..

जवाबों:


182

यदि आप यह सुनिश्चित करते हैं कि शामिल प्रत्येक संदर्भ में प्रत्येक स्थान धारक, अनार्य कुंजियों को अनदेखा कर रहा है, तो ये दोनों दृष्टिकोण काम करते हैं। उदाहरण के लिए:

<context:property-placeholder
location="classpath:dao.properties,
          classpath:services.properties,
          classpath:user.properties"
ignore-unresolvable="true"/>

या

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:dao.properties</value>
                <value>classpath:services.properties</value>
                <value>classpath:user.properties</value>
            </list>
        </property> 
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
    </bean>

11
यहाँ इस विषय पर एक उपयोगी प्रविष्टि है जो आपको इन मुद्दों को सुलझाने में मदद करनी चाहिए: tarlogonjava.blogspot.com/2009/02/tips-regcing-springs.html
टिम हेन्नेकी

2
धन्यवाद!! उपेक्षा-अनार्य = "सच्चा" वास्तव में मुझे क्या चाहिए था और इसने चाल चली!
काला ६६६

1
यदि आप 1 टैग में सभी फ़ाइल जोड़ते हैं, तो आवश्यकता नहीं है ignore-unresolvable="true", अन्यथा आवश्यकता नहीं है।
एरिक वांग

क्या आप इसका अर्थ समझा सकते हैं ignoreUnresolvablePlaceholders? अनार्य स्थान धारक क्या हैं?
पन्नाधाय

PropertySourcesPlaceholderConfigurerस्प्रिंग 3.1 के बाद से डिफ़ॉल्ट बैकिंग कार्यान्वयन है, इसलिए PropertyPlaceholderConfigurerबीन कार्यान्वयन वर्ग के बजाय इसका उपयोग करना समझदारी है ।
जिहोर

18

मुझे पता है कि यह एक पुराना सवाल है, लेकिन ignore-unresolvableसंपत्ति मेरे लिए काम नहीं कर रही थी और मुझे नहीं पता था कि क्यों।

समस्या यह थी कि मुझे एक बाहरी संसाधन की जरूरत थी (जैसे कुछ location="file:${CATALINA_HOME}/conf/db-override.properties") और ignore-unresolvable="true"इस मामले में काम नहीं करता है।

लापता बाहरी संसाधन की अनदेखी के लिए किसी को क्या करने की आवश्यकता है:

ignore-resource-not-found="true"

बस के मामले में किसी और इस में कूदता है।


3
ignore-unresolvableऔर ignore-resource-not-foundविभिन्न उद्देश्यों की पूर्ति करें। जब संपत्ति फ़ाइल मौजूद नहीं है, तो त्रुटियों को रोकने के लिए ignore-resource-not-found="true"। जब आप फ़ाइल में मौजूद गुण का उपयोग करते हैं, तो त्रुटियों को रोकने के लिए उपयोग करें ignore-unresolvable="true"। यदि आपके पास ऐसी कई फाइलें हैं जिनमें से प्रत्येक में गुणों के आंशिक सेट हैं, और प्रत्येक फ़ाइल मौजूद हो सकती है या नहीं, तो आपको दोनों का उपयोग करने की आवश्यकता होगी।
दत्तगुई

8

आपके पास <context:property-placeholder />स्पष्ट रूप से एक से अधिक गुण घोषित करने के बजाय कई गुण हो सकते हैं।


मैंने दो <संदर्भ का उपयोग करने की कोशिश की: संपत्ति-प्लेसहोल्डर /> तत्वों और वसंत ने शिकायत की कि यह निर्दिष्ट संपत्ति की पहचान नहीं कर सका। मुझे इसके लिए स्वीकृत उत्तर को लागू करना होगा।
मुशी

4

PropertiesPlaceholderConfigurerसेम एक वैकल्पिक संपत्ति "propertiesArray" कहलाता है। "गुण" संपत्ति के बजाय इसका उपयोग करें, और इसे <array>संपत्ति संदर्भों के साथ कॉन्फ़िगर करें ।


2

मैंने नीचे दिए गए समाधान की कोशिश की, यह मेरी मशीन पर काम करता है।

<context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" />

<context:property-placeholder location="classpath*:general.properties" order="2"/>

मामले में कई तत्व स्प्रिंग संदर्भ में मौजूद हैं, कुछ सर्वोत्तम प्रथाएं हैं जिनका पालन किया जाना चाहिए:

आदेश विशेषता को निर्दिष्ट करने की आवश्यकता है ताकि उस क्रम को ठीक किया जा सके जिसमें ये सभी प्रॉपर्टी प्लेसहोल्डर्स द्वारा माइनस किए गए हों, जो पिछले एक (उच्चतम ऑर्डर) को ignore-unresolvable=”true”एक अपवाद के बिना संदर्भ में दूसरों को पास करने के लिए रिज़ॉल्यूशन तंत्र को अनुमति देने के लिए होना चाहिए।

स्रोत: http://www.baeldung.com/2012/02/06/properties-with-spring/


क्या आदेश की आवश्यकता है? मैंने यह कोशिश की और जेवीएम ने शिकायत की।
मुशी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.