बीन की संपत्ति को स्प्रिंग कॉन्फिगर फाइल में एनम मान कैसे निर्दिष्ट करें?


109

मेरे पास एक स्टैंडअलोन एनम प्रकार परिभाषित है, कुछ इस प्रकार है:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

अब, मैं उस प्रकार के मूल्य को सेम प्रॉपर्टी में इंजेक्ट करना चाहता हूं:

<bean name="someName" class="my.pkg.classes">
   <property name="type" value="my.pkg.types.MyEnumType.TYPE1" />
</bean>

... और वह काम नहीं किया :(

मुझे एक स्प्रिंग बीन में एक एनम कैसे इंजेक्ट करना चाहिए?

जवाबों:


129

क्या आपने सिर्फ "TYPE1" की कोशिश की है? मुझे लगता है कि वसंत वैसे भी "प्रकार" के प्रकार को निर्धारित करने के लिए प्रतिबिंब का उपयोग करता है, इसलिए पूरी तरह से योग्य नाम बेमानी है। वसंत आमतौर पर अतिरेक की सदस्यता नहीं लेता है!


1
बहुत अजीब है कि पूरी तरह से योग्य नाम काम नहीं करता है।
रयान स्टूल

लेकिन क्या हो अगर मैं "$ {tes.db.database: ORACLE}" जैसी किसी चीज़ का उपयोग करना चाहता हूं, यानी किसी संपत्ति को डिफ़ॉल्ट करना। यह काम करने में विफल रहता है। कृपया मदद करें
Shubhi224

39

मान विशेषता के बजाय मान बाल तत्व का उपयोग करें और Enum वर्ग नाम निर्दिष्ट करें:

<property name="residence">
    <value type="SocialSecurity$Residence">ALIEN</value>
</property>

सिर्फ लिखने पर इस दृष्टिकोण का लाभ यह value="ALIEN"है कि यह भी काम करता है अगर वसंत संपत्ति से वास्तविक प्रकार के एनम का अनुमान नहीं लगा सकता है (जैसे संपत्ति का घोषित प्रकार एक इंटरफ़ेस है)। अरकनिद की टिप्पणी से अनुकूलित।


6
यह काम करता है यदि स्प्रिंग संपत्ति से वास्तविक प्रकार का पता नहीं लगा सकता है (जैसे संपत्ति सिर्फ एक इंटरफ़ेस है)
araqnid

@ वर्णक: अच्छी बात है। मैंने उत्तर में इसे जोड़ने की स्वतंत्रता ली।
sleske

@ टिप्पणी: क्या मैं वैल्यू टैग के भीतर स्प्रिंग ईएल का उपयोग कर सकता हूं? $ {abc: ALIEN}
Shubhi224

32

मुझे पता है कि यह वास्तव में एक पुराना सवाल है, लेकिन अगर कोई ऐसा करने के लिए नए तरीके की तलाश में है, तो स्प्रिंग यूज़ नेमस्पेस का उपयोग करें:

<util:constant static-field="my.pkg.types.MyEnumType.TYPE1" />

जैसा कि वसंत प्रलेखन में वर्णित है ।



4

यह मेरे लिए क्या किया है MessageDeliveryMode सेम है मान बीन का मूल्य होगा:

<bean class="org.springframework.amqp.core.MessageDeliveryMode" factory-method="valueOf">
    <constructor-arg value="PERSISTENT" />
</bean>

4

SPEL और P-NAMESPACE का उपयोग करना:

<beans...
xmlns:p="http://www.springframework.org/schema/p" ...>
..
<bean name="someName" class="my.pkg.classes"
    p:type="#{T(my.pkg.types.MyEnumType).TYPE1}"/>

1

विशिष्ट होने के लिए, मान को अपने मामले में enum प्रकार, जैसे "TYPE1" या "TYPE2" के एक स्थिर नाम के रूप में सेट करें, जैसा कि नीचे दिखाया गया है। और यह काम करेगा:

<bean name="someName" class="my.pkg.classes">
   <property name="type" value="TYPE1" />
</bean>

0

यदि आप आगे मूल्य जोड़ना चाहते हैं और कस्टम प्रकारों को लिखना चाहते हैं, तो आप बीन एडिटर्स (स्प्रिंग डॉक्स में विवरण) लिख सकते हैं।


0

वसंत-एकीकरण उदाहरण, एक एनम क्षेत्र पर आधारित रूटिंग:

public class BookOrder {

    public enum OrderType { DELIVERY, PICKUP } //enum
    public BookOrder(..., OrderType orderType) //orderType
    ...

config:

<router expression="payload.orderType" input-channel="processOrder">
    <mapping value="DELIVERY" channel="delivery"/>
    <mapping value="PICKUP" channel="pickup"/>
</router>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.