क्या मैं स्प्रिंग में @ वेल्यू के लिए डिफ़ॉल्ट मान के रूप में शून्य सेट कर सकता हूं?


100

मैं वर्तमान में इस तरह @Value स्प्रिंग 3.1.x एनोटेशन का उपयोग कर रहा हूं:

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

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

जवाबों:


66

आपको 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
जावा कॉन्फ़िगरेशन इसके समकक्ष क्या है?
कुमार सम्भल

30
stackoverflow.com/questions/9347929/… में $ {some.param: # {null}} का उपयोग करने का उल्लेख है, और जो nullValue को सेट किए बिना मेरे लिए काम करता है, ऐसा लगता है कि यह डिफ़ॉल्ट है? (एक स्प्रिंग बूट आवेदन में।)
vorburger

5
एसपीईएल $ के सरल उपयोग बिजली {stuff.value: # {अशक्त}} के रूप में vorburger द्वारा और में सुझाव दिया stackoverflow.com/questions/16735141/...
सीएसएफ

लगता है बहुत कम विन्यास ben3000 और JRichardsz जवाब के लिए आवश्यक है।
जेफ

193

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

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

इस प्रश्न को देखें ।


49

@Vorburger को धन्यवाद:

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

बिना किसी अन्य कॉन्फ़िगरेशन के स्ट्रिंग मान को शून्य पर सेट करेगा ।


3
वसंत-बूट पिछले 2019 संस्करण में काम किया: 2.1.7.RELEASE ... start.spring.io
JRichardsz

2

मैं @nosebrain को क्रेडिट देता हूं क्योंकि मुझे "null-value" के बारे में नहीं पता था, लेकिन मैं विशेष रूप से 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कोमा से अलग हो जाना चाहते हों या शायद एनम को स्विच करना आसान हो। इसका इकाई परीक्षण भी आसान है :)

EDIT: एनम का उपयोग करने के बारे में आपकी टिप्पणियों और अशक्त का उपयोग न करने की मेरी राय पर आधारित है।

@Component
public class MyObject {

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

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

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

crap=NOTSET

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


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

सभी अधिक कारण है कि मैं अशक्त की सिफारिश नहीं करेगा, बल्कि इसके बजाय कुछ ईनम का प्रतिनिधित्व करता है जो सेट नहीं करता है।
एडम जेंट

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

मैं यह कोशिश नहीं की है, लेकिन सिद्धांत में @Value("${stuff.value:NOTSET}")काम नहीं करेगा ?
एडम जेंट

हां, यह एक अच्छा उपाय है। दुर्भाग्य से मैं एनम (डिप) को नहीं बदल सकता, इसलिए मुझे अशक्त के साथ जाना होगा। अन्यथा आप सही हैं, NOTSET काम करेगा।
केविन श्मिट

0

यदि आपको खाली (0 लंबाई) "" स्ट्रिंग @Value डिफ़ॉल्ट के रूप में इंजेक्ट करने की आवश्यकता है - SPEL (स्प्रिंग एक्सप्रेशन लैंग्वेज) का उपयोग इस प्रकार करें:

@Value("${index.suffix:#{''}}") 
private String indexSuffix;

# {''} बस आपको खाली स्ट्रिंग मिलती है जैसे कि @ मान डिफ़ॉल्ट।

yl द्वारा

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