13

मेरे पास प्रॉपर्टीप्लेसहोल्डर कॉन्फ़िगरर के साथ स्प्रिंग एप्लिकेशन-context.xml है .properties फ़ाइल से गुणों के मान प्राप्त करने के लिए। मुख्य और परीक्षण स्रोत फ़ोल्डर में अलग .properties फ़ाइल है। मुद्दा यह है कि मुझे .properties फ़ाइल में पर्यावरण चर का उपयोग करने की आवश्यकता है। लेकिन जब मैं निम्नलिखित तरीके से यह कार्य करें:प्रॉपर्टीप्लेसहोल्डर कॉन्फ़िगरर और .properties फ़ाइलों में पर्यावरण चर

property.name=${env.SYSTEM_PROPERTY} 

मैं निम्न त्रुटि हो रही है: कैसे बनाने के

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'beanName' defined in class path resource [com/example/applicationContext.xml]: Could not resolve placeholder 'env.SYSTEM_PROPERTY' 

जबकि प्लेसहोल्डर configurer रूप

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:com/example/application.properties"/> 
</bean> 

परिभाषित कोई भी विचार property.name को पर्यावरण चर के रूप में व्याख्या किया जा सकता है (और प्लेसहोल्डर के रूप में नहीं)?

सर्वश्रेष्ठ संबंध, दिमित्री।

उत्तर

23

मैं शायद समाधान पूरी तरह से बदल देंगे: के रूप में संपत्ति जो एक प्रणाली संपत्ति

जैसे को संदर्भित करता है इंजेक्शन लगाने के लिए विरोध सीधे प्रणाली संपत्ति इंजेक्षन,

@Value("#{ systemProperties['JAVA_MY_ENV'] }") 
private String myVar; 

या

<property name ="myVar" value="#{systemProperties['JAVA_MY_ENV']}"/> 

मैं इस

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
    <list> 
     <value>classpath:someprops.properties</value> 
    </list> 
    </property> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="searchSystemEnvironment" value="true" /> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 

की तरह एक संपत्ति प्लेसहोल्डर configurer का उपयोग तुम भी

-DJAVA_MY_ENV=xyz 

इस का उपयोग करते हुए इस कार्यक्रम में पैरामीटर पारित करने के लिए याद रखना चाहिए जब आप उत्पादन संस्करण चलाएं जिसे आप एक चीज़ पारित कर सकते हैं और जब आप दूसरे परीक्षण कर रहे हों।

इसके अलावा क्या मैं अक्सर मैं क्या कुछ इस तरह है:

<property name="locations"> 
    <list> 
     <value>classpath:someprops.properties</value> 
     <value>classpath:someprops-{environment}.properties</value> 
    </list> 
    </property> 

जहां वातावरण है prod/मंच/परीक्षण/पूर्णांक/ci/स्थानीय (1 पर्यावरण प्रति - आप केवल 2 या 3 के लिए हो सकता है अभी व)। आप पर्यावरण चर को प्रोग्राम में पास कर सकते हैं। कोई भी गुण जो कि आपके स्थानीय पीसी/परीक्षणों पर इसका उत्पादन/चल रहा है, वैसे ही होना चाहिए, कुछprops.properties प्रॉपर्टी फ़ाइल में होगा। किसी भी पर्यावरण/जिस तरह से अपनी चलाया जा रहा के रूप में अधिक विशिष्ट फ़ाइल में जाना होगा के लिए विशिष्ट लोगों

जैसे (आप जब तक ओवरराइड तंत्र डिफ़ॉल्ट के रूप में someprops.properties में रख चाहिए और साथ ही फाइल) classpath में :

url=www.mysite.com 

someprops.properties classpath में: someprops-local.properties

url=localhost 

इस मूल विचार का उपयोग कर आप एक स्वच्छ तरीके से परीक्षण और कार्यक्रम के सामान्य चल रहा है गुण अलग कर सकते हैं के द्वारा।

+0

यह काफी अच्छा है। हालांकि एक समस्या यह है कि रनटाइम वैरिएबल को परिभाषित करना भूलना मुश्किल रनटाइम त्रुटियों का उत्पादन करता है, जैसे config_xxx फ़ाइल नहीं मिली और पसंद है। उस स्थिति में सुधार करने के लिए मैं एक बीन पंजीकृत करता हूं जो इस तरह के विशेष वसंत इंटरफेस लागू करता है: क्लास एनवायरनमेंट रिपोर्टर प्राथमिकताऑर्डर्ड, बीनफैक्टरीपोस्टप्रोसेसर, एनवायरनमेंटवेयर {...} पर्यावरण .getProperty मुझे अपेक्षित गुणों की जांच करने की अनुमति देता है और किसी भी अन्य बीन से पहले साफ हो जाता है बनाया था। – Federico

7

का उपयोग करना:

property.name=${env.SYSTEM_PROPERTY} 

करने के लिए::

<context:property-placeholder location="classpath:env.properties"/> 
अपने

बदलें

property.name=${SYSTEM_PROPERTY} 

मैं वसंत 3.0.4.RELEASE उपयोग कर रहा हूँ, लेकिन मैं पता नहीं जब इस राशि परिचय करवाया गया था।

+1

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

+1

अजीब - वसंत 3.0.4 का उपयोग करके, यह काम नहीं लग रहा है –

0

मैं benkiefer के दृष्टिकोण का इस्तेमाल किया है, लेकिन मैं web.xml करने के लिए एक श्रोता जोड़ने के लिए किया था:

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
संबंधित मुद्दे