2012-08-16 9 views
54

मैं वर्तमान में इस तरह @value स्प्रिंग 3.1.x एनोटेशन उपयोग कर रहा हूँ:क्या मैं वसंत में @ वैल्यू के लिए डिफ़ॉल्ट मान के रूप में शून्य सेट कर सकता हूं?

@Value("${stuff.value:}") 
private String value; 

यह चर में एक खाली स्ट्रिंग डालता है यदि विशेषता मौजूद नहीं है। मैं खाली स्ट्रिंग के बजाय डिफ़ॉल्ट के रूप में शून्य करना चाहता हूं। निस्संदेह मैं संपत्ति की सामग्री के दौरान एक त्रुटि से बचना चाहता हूं। औसत सेट नहीं है।

उत्तर

46

आपको PropertyPlaceholderConfigurer का nullValue सेट करना होगा। उदाहरण के लिए मैं स्ट्रिंग @null का उपयोग कर रहा हूं लेकिन आप खाली स्ट्रिंग को nullValue के रूप में भी उपयोग कर सकते हैं।

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <!-- config the location(s) of the properties file(s) here --> 
    <property name="nullValue" value="@null" /> 
</bean> 

अब आप स्ट्रिंग @null उपयोग कर सकते हैं null मूल्य का प्रतिनिधित्व करने के

@Value("${stuff.value:@null}") 
private String value; 

कृपया ध्यान दें: संदर्भ नाम स्थान इस समय शून्य मान समर्थन नहीं करता। आप उपयोग नहीं कर सकते

<context:property-placeholder null-value="@null" ... /> 

वसंत के साथ परीक्षण किया गया 3.1.1

+2

जावा कॉन्फ़िगरेशन इसके बराबर क्या है? –

+18

http://stackoverflow.com/questions/9347929/spring-set-a-property-only-if-the-value-is-not- $ {some.param: # {null}} का उपयोग करके कोई भी उल्लेख नहीं है, और वह nullValue सेट किए बिना मेरे लिए काम किया, ऐसा लगता है कि यह डिफ़ॉल्ट है? (स्प्रिंग बूट एप्लिकेशन में।) – vorburger

+3

स्पेल $ {stuff.value: # {null}} की सरल उपयोग शक्ति vorburger द्वारा सुझाए गए अनुसार और http://stackoverflow.com/questions/16735141/specify-default-property- मूल्य-के-नल-इन-वसंत – csf

2

मैं क्रेडिट के बारे में मैं "नल-मूल्य" पता नहीं था के रूप में @nosebrain दे, लेकिन मैं पूरी तरह विशेष रूप से शून्य मान का उपयोग कर से बचने के लिए के बाद से पसंद करते हैं अपने गुण फ़ाइल में null का प्रतिनिधित्व करना मुश्किल है।

लेकिन यहां null-value के साथ शून्य का उपयोग करने का विकल्प है, इसलिए यह कभी भी संपत्ति प्लेसहोल्डर के साथ काम करेगा।

public class MyObject { 

    private String value; 

    @Value("${stuff.value:@null}") 
    public void setValue(String value) { 
     if ("@null".equals(value)) this.value = null; 
     else this.value = value; 
    } 
} 

निजी तौर पर मैं अपने रास्ते को पसंद करते हैं क्योंकि हो सकता है बाद में आप चाहते हैं stuff.value एक अल्पविराम से अलग-मूल्य होने के लिए या शायद Enum करने के लिए स्विच आसान है। यूनिट टेस्ट के लिए यह भी आसान है :)

संपादित करें: एनम्स का उपयोग करने और नल का उपयोग न करने की मेरी राय के आधार पर आपकी टिप्पणियों के आधार पर।

@Component 
public class MyObject { 

    @Value("${crap:NOTSET}") 
    private Crap crap; 

    public enum Crap { 
     NOTSET, 
     BLAH; 
    } 
} 

उपर्युक्त मेरे लिए ठीक काम करता है। आप शून्य से बचें। यदि आपकी प्रॉपर्टी फाइलें स्पष्ट रूप से सेट करना चाहते हैं कि वे इसे संभालना नहीं चाहते हैं तो आप (करते हैं लेकिन आपको इसे निर्दिष्ट करने की भी आवश्यकता नहीं है क्योंकि यह NOTSET पर डिफ़ॉल्ट होगा)।

crap=NOTSET 

null बहुत खराब है और NOTSET से अलग है। इसका मतलब है वसंत या यूनिट परीक्षण ने इसे सेट नहीं किया है, यही कारण है कि आईएमएचओ एक अंतर है। मैं अभी भी सेटटर नोटेशन (पिछला उदाहरण) का उपयोग कर सकता हूं क्योंकि यूनिट टेस्ट के लिए आसान है (यूनिट टेस्ट में निजी चर सेट करना मुश्किल है)।

+0

स्ट्रिंग मान एक उदाहरण था, मुझे वास्तव में एनम मान के लिए इसकी आवश्यकता थी, जहां एक खाली स्ट्रिंग केवल रूपांतरण त्रुटि का कारण बनती है। @ नल के साथ आप "नो एनम सेट" के रूप में एक शून्य हो सकते हैं, जो मुझे चाहिए। –

+0

सभी कारणों से मैं शून्य की अनुशंसा नहीं करता लेकिन इसके बजाय कुछ enum जो सेट नहीं करता है। –

+0

जिसके लिए सभी गुण फ़ाइलों (> 30) में Enum.NOTSET डालने की आवश्यकता होगी, जो लगभग कोई लाभ नहीं के साथ बहुत काम करता है ... –

61

यह वास्तव में पुराना है, लेकिन आप अब स्प्रिंग ईएल का उपयोग कर सकते हैं, उदा।

@Value("${stuff.value:#{null}}")

this question देखें।

4

@vorburger के लिए धन्यवाद:

@Value("${email.protocol:#{null}}") 
String protocol; 

किसी अन्य विन्यास के बिना अशक्त में स्ट्रिंग मान सेट हो जाएगा।

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

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