वैकल्पिक के रूप में @Value को कैसे परिभाषित करें


119

मेरे पास एक स्प्रिंग बीन में निम्नलिखित है:

@Value("${myValue}")
private String value;

मान सही ढंग से इंजेक्ट किया गया है। हालाँकि, चर को वैकल्पिक होने की आवश्यकता है, इसे कमांड लाइन पैरामीटर के रूप में पारित किया जाता है (जो कि एक SimpleCommandLinePropertySource का उपयोग करके स्प्रिंग संदर्भ में जोड़ा जाता है ), और यह तर्क हमेशा मौजूद नहीं होगा।

मैंने डिफ़ॉल्ट मान प्रदान करने के लिए निम्नलिखित दोनों की कोशिश की है:

@Value("${myValue:}")
@Value("${myValue:DEFAULT}")

लेकिन प्रत्येक मामले में, बृहदान्त्र के बाद डिफ़ॉल्ट तर्क को वास्तविक मूल्य होने पर भी इंजेक्ट किया जाता है - यह प्रकट होता है कि स्प्रिंग को क्या इंजेक्ट करना चाहिए।

यह निर्दिष्ट करने का सही तरीका क्या है कि @Value की आवश्यकता नहीं है?

धन्यवाद


यह बहुत अजीब है ... डिफ़ॉल्ट मान केवल डिफ़ॉल्ट मान के रूप में कार्य करना चाहिए (अर्थात जब संपत्ति परिभाषित नहीं होती है)। क्या आप अपने बयान की जांच कर सकते हैं "वास्तविक मूल्य होने पर भी डिफ़ॉल्ट मान इंजेक्ट किया जाता है" (जैसे कि कोई पुराना संकलित वर्ग नहीं है)?
पावेल हॉरल

7
@Value("${some.prop:}")मेरे लिए काम करता है। उस वेरिएबल पर केवल यही एनोटेशन है।
जरथुस्त्र

क्या आप अपना एप्लिकेशन कॉन्फिगर कर सकते हैं?
व्लादिमीर वागयत्सेव

@Autowired (आवश्यक = गलत)?
एंड्रयू स्कॉट इवांस

जवाबों:


179

यह निर्दिष्ट करने का सही तरीका क्या है कि @Value की आवश्यकता नहीं है?

इस धारणा पर काम करते हुए कि 'आवश्यक नहीं' से आपका मतलब है null...

आपने सही ढंग से नोट किया है कि आप किसी :चरित्र के दाईं ओर डिफ़ॉल्ट मान की आपूर्ति कर सकते हैं । आपका उदाहरण था @Value("${myValue:DEFAULT}")

आप डिफ़ॉल्ट मान के रूप में सादे स्ट्रिंग तक सीमित नहीं हैं। आप SPEL अभिव्यक्तियों का उपयोग कर सकते हैं , और लौटने के लिए एक सरल SPEL अभिव्यक्ति nullहै:

@Value("${myValue:#{null}}")

49

यदि आप जावा 8 का उपयोग कर रहे हैं, तो आप इसकी java.util.Optionalकक्षा का लाभ उठा सकते हैं । आपको बस इस तरह से चर घोषित करना होगा:

@Value("${myValue:#{null}}")
private Optional<String> value;

फिर, आप जाँच सकते हैं कि मूल्य परिभाषित किया गया है या नहीं

if (value.isPresent()) {
    // do something cool
}

आशा करता हूँ की ये काम करेगा!


4
इंटेलीज विचार के अनुसार। Optionalवर्ग क्षेत्रों में प्रकारों का उपयोग करना सबसे अच्छा अभ्यास नहीं है ।
फ्रात K FK

2
आप ऐसा करते हैं और यह एक NPE फेंकता है। valueशून्य है।
14

1
@aatk ऐसा लगता है कि आपके द्वारा वर्णित मुद्दा कम से कम 4.3.13 के बाद से तय किया गया है। मुझे वर्णित घोषणा का उपयोग करने में कोई परेशानी नहीं है। हालांकि यह केवल एक अशक्त
Torben

2
"इंटेलीजे विचार के अनुसार, यह क्लास फील्ड में वैकल्पिक प्रकार का उपयोग करने के लिए सबसे अच्छा अभ्यास नहीं है।" उदाहरण चर के रूप में वैकल्पिक का उपयोग करने के बारे में क्या गलत है? केवल यह कि अपेक्षाकृत लंबे समय तक रहते हैं जब इसे गेटर्स में उपयोग किया जाता है ... और ऐसे क्षेत्र को क्रमिकता के लिए क्षणिक चिह्नित किया जाना चाहिए?
एंड्री एम। स्टेपानोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.