क्या स्प्रिंग XML में डिफ़ॉल्ट संपत्ति मान निर्दिष्ट करने का कोई तरीका है?


91

हम अपने वसंत विन्यास में जावा गुणों का उपयोग करने के लिए एक PropertyPlaceholderConfigurer का उपयोग कर रहे हैं ( विवरण यहां )

उदाहरण के लिए:

<foo name="port">
  <value>${my.server.port}</value>
</foo>

हम एक अतिरिक्त संपत्ति जोड़ना चाहते हैं, लेकिन एक वितरित प्रणाली है जहां मौजूदा उदाहरण सभी डिफ़ॉल्ट मान का उपयोग कर सकते हैं। क्या हमारी संपत्तियों की सभी फाइलों को अपडेट करने से बचने का कोई तरीका है, जब स्प्रिंग ओवरफ्लो में डिफ़ॉल्ट मान का संकेत देकर, जब कोई ओवरराइडिंग प्रॉपर्टी वैल्यू परिभाषित नहीं होती है?

जवाबों:


14

क्या आप यहां प्रॉपर्टीऑवरराइडऑनफिगर के लिए प्रलेखित हैं

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-overrideconfigurer

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


क्या कोई मुझे समझा सकता है कि क्या 18GerPD8fY4iTbNpC9hHNXNHyrDMampPLAहै? मुझे यकीन है कि हर कोई जानता है और मैं सिर्फ बेवकूफ हूं, लेकिन सिर्फ मामले में ...
श्रीधर सरनोबत

276

स्प्रिंग 3 ${my.server.port:defaultValue}सिंटैक्स का समर्थन करता है।


8
केवल संदर्भ के लिए: एसपीआर
-4785

11
मेरे लिए, यह हमेशा डिफ़ॉल्ट मान के साथ संपत्ति को ओवरराइड करता है चाहे संपत्ति परिभाषित हो या न हो।
Ondrej Bozek

12
@OndrejBozek - (एक पुरानी पोस्ट को टक्कर देने के लिए क्षमा करें) मैं वही समस्या हो सकती है, जो स्प्रिंग फ्रेमवर्क समस्या [ jira.spring.io/browse/SPR-9989] देखें । जहाँ कई प्लेसहोल्डर कॉन्फ़िगरेशनकर्ता शामिल हैं, '': '' नोटेशन के साथ निर्दिष्ट डिफ़ॉल्ट मान केवल श्रृंखला में पहले प्लेसहोल्डर कॉन्फ़िगरेशनकर्ता द्वारा हल किए जाते हैं। इसलिए यदि पहले विन्यासकर्ता के पास संपत्ति नहीं है, तो संपत्ति हमेशा डिफ़ॉल्ट मान पर सेट की जाएगी, भले ही आगे श्रृंखला के नीचे के विन्यासकर्ता के पास संपत्ति हो। [ Stackoverflow.com/a/22452984/599609]
टन

1
ऐसा लगता ${my.server.port:-defaultValue}है कि यह भी एक ही परिणाम देता है, " :-" के विपरीत " " पर ध्यान दें :
कप्तान मैन

2
इसके लिए आपको काम करने के लिए जोड़ने की जरूरत है <context:property-placeholder/>, या PropertyPlaceholderConfigurer
बजे

32

थोड़ी ज्ञात विशेषता है, जो इसे और बेहतर बनाती है। आप एक हार्ड-कोडेड के बजाय एक कॉन्फ़िगर करने योग्य डिफ़ॉल्ट मान का उपयोग कर सकते हैं, यहां एक उदाहरण है:

config.properties:

timeout.default=30
timeout.myBean=60

context.xml:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>config.properties</value>
    </property>
</bean>

<bean id="myBean" class="Test">
    <property name="timeout" value="${timeout.myBean:${timeout.default}}" />
</bean>

बाद में आसानी से ओवरराइड करने में सक्षम होने के दौरान डिफ़ॉल्ट का उपयोग करने के लिए, config.properties में ऐसा करें:

timeout.myBean = ${timeout.default}

इसने मेरे लिए काम किया ${timeout.myBean:${timeout.default}}। इसने मेरे डिफॉल्ट को भी वैरिएबल होने दिया।
NewestStackOverflowUser


10

:प्रॉपर्टी की के बाद डिफ़ॉल्ट मान का पालन किया जा सकता है , जैसे

<property name="port" value="${my.server.port:8080}" />

या जावा कोड में:

@Value("${my.server.port:8080}")
private String myServerPort;

देख:

BTW, एल्विस ऑपरेटर वसंत अभिव्यक्ति भाषा (स्पेल) के भीतर ही उपलब्ध है,
उदाहरण के लिए: https://stackoverflow.com/a/37706167/537554


8

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html बताते हैं कि बीन पर परिभाषित "स्थानीय गुणों" को फ़ाइलों के लिए पढ़े गए मानों द्वारा ओवरराइड किया जाना माना जाएगा:

<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  <property name="location"><value>my_config.properties</value></property>  
  <property name="properties">  
    <props>  
      <prop key="entry.1">123</prop>  
    </props>  
  </property>  
</bean> 

thx, स्प्रिंग जेवाडॉक में उस बारे में कुछ शब्द थे, लेकिन मैं यह नहीं समझ पा रहा था कि यह कैसे किया जाए!
गिलौम

0

इसके अलावा मैं एक और समाधान ढूंढता हूं जो मेरे लिए काम करता है। हमारे लीगेसी स्प्रिंग प्रोजेक्ट में, हम अपने उपयोगकर्ताओं को इस कॉन्फ़िगरेशन का उपयोग करने की संभावनाएं देने के लिए इस पद्धति का उपयोग करते हैं:

<bean id="appUserProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="ignoreResourceNotFound" value="false"/>
    <property name="locations">
        <list>
            <value>file:./conf/user.properties</value>
        </list>
    </property>
</bean>

और इस गुण का उपयोग करने के लिए हमारे कोड में ऐसा कुछ लिखने की आवश्यकता है:

@Value("#{appUserProperties.userProperty}")
private String userProperty

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

इस समस्या को संभालने के लिए आप डिफ़ॉल्ट मान जोड़ने के लिए अगले सिंटैक्स का उपयोग कर सकते हैं:

@Value("#{appUserProperties.get('userProperty')?:'default value'}")
private String userProperty

यह मेरे लिए एक वास्तविक खोज थी।

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