2016-02-22 5 views
9

मैं एक संपत्ति के साथ एक application.properties के लिए @value बाँधस्प्रिंग बूट Enum केस संवेदी

@Value("${custom.property}") 
protected Property property; 

मैं एक enum है:

public enum Property { 

    A, 
    AB, 
    ABC, 
    ABCD, 
    ABCDE; 
} 

जब मैं एक

साथ आवेदन चल रहा हूँ

Cannot convert value of type [java.lang.String] to required type [com.blabla.domain.enums.Property]: no matching editors or conversion strategy found.

custom.property=ABC (upper case) 

वर्क्स ठीक:

custom.property=abc (lower case) 

मैं एक त्रुटि है।

वहाँ मूल्य केस संवेदी बाध्य करने के लिए एक तरीका है? एबीसी की तरह, एबीसी, एबीसी किसी भी मैच काम करना चाहिए। अग्रिम में धन्यवाद।

नोट: मैंने यह प्रश्न देखा - Spring 3.0 MVC binding Enums Case Sensitive लेकिन मेरे मामले में मेरे पास 10 से अधिक enums/values ​​(और अधिक होने की उम्मीद है) कक्षाएं और 10 अलग-अलग कस्टम प्रॉपर्टी बाइंडर्स को लागू करने के लिए दर्दनाक होगा, मुझे कुछ सामान्य समाधान की आवश्यकता है।

+0

आराम से बाध्यकारी के साथ एक संभावित बग की तरह दिखता है। – chrylis

+0

क्षमा करें, संपादित विवरण। मूल्य का मामला बदल गया। –

उत्तर

8

@Value और @ConfigurationProperties सुविधाओं मेल नहीं खाते। मैं पर्याप्त तनाव नहीं दे सका कि कैसे @ConfigurationProperties बेहतर है।

सबसे पहले, आप एक सरल POJO में आपके विन्यास है कि आप इंजेक्षन कर सकते हैं भी आप (बल्कि एनोटेशन में भाव यह है कि आप आसानी से एक टाइपो साथ तोड़ सकते हैं की तुलना में) चाहते हैं डिजाइन करने के लिए मिलता है। दूसरा, मेटा-डेटा समर्थन का अर्थ है कि आप बहुत आसानी सेget auto-completion in your IDE for your own keys कर सकते हैं।

और अंत में, दस्तावेज़ में वर्णित बंधन में ढील केवल @ConfigurationProperties पर लागू होता है। @Value एक स्प्रिंग फ्रेमवर्क सुविधा है और आराम से बाध्यकारी से अनजान है। हम intend to make that more clear in the doc

टीएल; डीआर abc@ConfigurationProperties के साथ काम करता है लेकिन @Value के साथ नहीं होगा।

+0

समझ में आता है। धन्यवाद! –

+0

@Stephane निकोल स्प्रिंग 4 के लिए सिफारिश क्या है? – userit1985

2

मान केस-संवेदी (कुंजी या पासवर्ड वातावरण से इंजेक्शन पर विचार कर रहे हैं), और तनाव मुक्त बाध्यकारी कुंजी के लिए एक ही लागू होता है। जावा एनम नाम भी केस-संवेदी हैं (A और a विशिष्ट मान हैं), और आप केस स्क्वैश नहीं करना चाहते हैं।

बस अपने विन्यास गुण में सही मामले का उपयोग करें।

+0

ठीक है, नामकरण सम्मेलनों के अनुसार दिशानिर्देश enum मान हमेशा ऊपरी मामले होना चाहिए, क्योंकि मान स्थिरांक हैं। इन गुणों के उपयोगकर्ता के अनुकूल उपयोग के लिए कुछ लोग हमेशा ऊपरी मामले के तरीके में मूल्य प्रदान करना भूल सकते हैं। यह वास्तव में एक कामकाज नहीं है। –

-3

एक व्यावहारिक दुनिया में, यह काम करता है ....

public enum Property { 
    A, a 
    AB, ab, 
    ABC, abc, 
    ABCD, abcd, 
    ABCDE, abcde; 

    public boolean isA() { 
     return this.equals(A) || this.equals(a); 
    } 

    public boolean isAB() { 
     return this.equals(AB) || this.equals(ab); 
    } 

    ...etc... 

} 

इस ..although enum के सिद्धांत को तोड़ने करता है!

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