2017-05-16 20 views
5

मैं निम्नलिखित क्षेत्र @Value साथ एनोटेट है, एक डिफ़ॉल्ट मान को निर्दिष्ट:स्प्रिंग @value एनोटेशन लागू न्यूनतम अधिकतम पूर्णांक

@Value("${tolerance.percentage:25}") 
private int tolerance; 

कि कोड को ठीक प्रणाली संपत्ति "tolerance.percentage" के लिए फ़ील्ड का मान initializes अगर वह प्रोप मौजूद है। यह मौजूद नहीं है, तो यह 25

को चूक मैं एक कदम आगे जाना चाहता हूँ, हालांकि, इस पूर्णांक मैदान पर एक न्यूनतम और अधिकतम लागू करने, के बाद से यह एक प्रतिशत एक पूरी संख्या के रूप में कम से कम 100 का प्रतिनिधित्व करता है के द्वारा, और मर्फी का कानून है कि कोई (शायद मुझे) संपत्ति को बाहरी रूप से गलत तरीके से कॉन्फ़िगर कर सकता है और मेरा ऐप रनटाइम पर अजीब चीजें करना शुरू कर देगा, जो मेरी पसंद के लिए बहुत देर हो चुकी है। यदि संपत्ति स्टार्टअप पर संपत्ति "101" या "-1" पर सेट की गई है तो मुझे एक त्रुटि फेंकना होगा। हेक, अगर मैं इसे @Value एनोटेशन में 101 तक डिफॉल्ट करने का प्रयास करता हूं, तो मुझे एक त्रुटि फेंकना भी पसंद है, लेकिन यह इस प्रश्न के प्रयोजनों के लिए महत्वपूर्ण नहीं है। यहाँ मैं क्या करने की कोशिश की है:

//@Min and @Max don't produce the intended behavior when combined with @Value 
@Min(0) 
@Max(100) 
@Value("${tolerance.percentage:25}") 
private int tolerance; 

मैं एक int मैदान पर एक न्यूनतम और अधिकतम लागू कर सकते हैं कि @Value के बारे में पता है?

+0

'@ मान' (यदि आपको लगता है कि सेम के रूप में स्टार्ट-अप समय में मूल्य injects एकमात्र के लिए, यकीन नहीं। 'prototype'); मुझे नहीं लगता कि आप सेम मान्यता उस समय (स्वतः) शुरू हो रहा होगा ... –

+3

आप केवल' @ ConfigurationProperties' कक्षाओं में मान्यता नियमित कक्षाओं में नहीं मिलेगा आप उन मूल्यों को मान्य करने के लिए चाहते हैं। सीमा की जाँच करें। या निर्माता को इसकी सुई और वहाँ में मान्यता है। –

+0

@ M.Deinum जोड़ना मेरी POJO को '@ ConfigurationProperties' के लिए एक' @ PostConstruct' विधि जोड़ने के लिए काम किया। यह जोड़ने के बाद, टिप्पणी के रूप में साथ काम करना शुरू मैंने सोचा कि वे करेंगे। अगर आप अपनी टिप्पणी औपचारिक रूप से करते हैं एक जवाब में, मैं इसे स्वीकार करूंगा। – JellyRaptor

उत्तर

4

मान्यता नियमित सत्यापन एपीआई एनोटेशन का उपयोग केवल कुछ निश्चित परिस्थितियों में काम करने के लिए जा रहा है।

  1. आप एक कार्यान्वयन है ('हाइबरनेट-सत्यापनकर्ता') classpath
  2. क्लास में उन्हें तो उन के साथ @Value उपयोग करने के बजाय आप शायद करना चाहते हैं externalized configuration

बाध्य करने के लिए उपयोग किया जाता है कर रहे हैं पर एक वर्ग बनाएं जिसमें अपेक्षित गुण हों और @ConfigurationProperties के साथ बाध्यकारी का उपयोग करें। (और आप इसके बजाय @Range का उपयोग करना चाहेंगे)।

@ConfigurationProperties(prefix="tolerance") 
public ToleranceProperties { 

    @Range(min=1, max=100) 
    private int percentage = 25; 

    // Here be a getter/setter 
} 

एक @Configuration वर्ग पर संयुक्त यह @ EnableConfigurationProperties(ToleranceProperties.class) जोड़ सकते हैं और आप उपयोग कर सकते हैं इसे कहीं भी आप गुण की जरूरत है। (संदर्भ गाइड में typesafe configuration properties देखें

नोट:। तुम भी रूप में यह घोषणा कर सकता है एक @Component

+0

मैं बस यह निर्धारित करने के लिए कि सेटटर अनिवार्य है, जबकि गेटर – Zotov

+0

बिना किसी गेटटर के होने के कारण यह वास्तविक अर्थ नहीं है, आप मूल्य कैसे प्राप्त करेंगे? (जब तक कि यह किसी अन्य संयुक्त संपत्ति का हिस्सा न हो)। –

+0

आप संभावित रूप से '@ कॉन्फ़िगरेशन' के साथ '@ घटक 'को एनोटेट कर सकते हैं, और फिर यह घटक आंतरिक रूप से उन गुणों का उपयोग करेगा। – Zotov

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