2009-07-23 16 views
38

के साथ एक मानचित्र में Enum कुंजी सेट करूँ मैं अपने 'मिक' वर्ग की तुलना में एक Enum वर्गस्प्रिंग - कैसे आप एनोटेशन

public enum MyEnum{ 
    ABC; 
} 

है इस संपत्ति

private Map<MyEnum, OtherObj> myMap; 

मैं इस वसंत में है है एक्सएमएल विन्यास।

<util:map id="myMap"> 
    <entry key="ABC" value-ref="myObj" /> 
</util:map> 

<bean id="mick" class="com.x.Mick"> 
    <property name="myMap" ref="myMap" /> 
</bean> 

और यह ठीक है।
मैं स्प्रिंग एनोटेशन के साथ इस एक्सएमएल कॉन्फ़िगरेशन को प्रतिस्थापित करना चाहता हूं।
क्या आपको नक्शा को स्वचालित करने के बारे में कोई जानकारी है?

समस्या यहां है कि अगर मैं @Autowired एनोटेशन के लिए एक्सएमएल config से स्विच स्प्रिंग (मिक वर्ग के myMap विशेषता पर) यह अपवाद नहीं पहचान करने में सक्षम फेंक है

nested exception is org.springframework.beans.FatalBeanException: Key type [class com.MyEnum] of map [java.util.Map] must be assignable to [java.lang.String] 

वसंत है स्ट्रिंग एबीसी एक MyEnum.ABC ऑब्जेक्ट के रूप में।
कोई विचार?

धन्यवाद

+0

यह स्पष्ट तुम क्या करने की कोशिश कर रहे हैं क्या नहीं है। आप किस तरह की टिप्पणियों के बारे में सोच रहे हैं? – skaffman

+0

मैं @Autowired एनोटेशन का उपयोग करना चाहता हूं लेकिन यह काम नहीं कर रहा है। क्या मुझे स्प्रिंग को उस स्ट्रिंग के बजाय एनम के रूप में व्यवहार करने के लिए कुछ और निर्दिष्ट करना है? – mickthompson

उत्तर

44

यह मेरे लिए काम किया ...

मेरे स्प्रिंग आवेदन संदर्भ:

<util:map id="myMap"> 
    <entry key="#{T(com.acme.MyEnum).ELEM1}" value="value1" /> 
    <entry key="#{T(com.acme.MyEnum).ELEM2}" value="value2" /> 
</util:map> 

मेरी कक्षा जहां Map इंजेक्शन हो जाता है:

public class MyClass { 

    private @Resource Map<MyEnum, String> myMap; 
} 

महत्वपूर्ण बातों का ध्यान करने के लिए कर रहे हैं वसंत संदर्भ मैंने SPEL (स्प्रिंग अभिव्यक्ति भाषा) का उपयोग किया जो केवल संस्करण 3.0 के बाद उपलब्ध है। और मेरी कक्षा में मैंने @Resource, न तो @Inject (यह मेरे लिए काम नहीं किया) और न ही @Autowired (मैंने यह कोशिश नहीं की) का उपयोग किया।एकमात्र अंतर जो मुझे @Resource और @Autowired के बीच के बारे में पता है, यह है कि बीन नाम से पूर्व ऑटो इंजेक्शन जबकि बाद में इसे बीन प्रकार से किया जाता है।

आनंद लें!

+9

'।' के बजाय '$' का उपयोग करना याद रखें स्प्रिंग ईएल में बाहरी कक्षा से एक आंतरिक enum को अलग करने के लिए। –

+6

बस एक अनुवर्ती कि '@ ऑटोवायर' भी नक्शा [java.util.Map] के लिए कुंजी प्रकार [वर्ग com.foo.Bar $ BAZ] प्रदान करेगा [java.lang.String] ',' @ संसाधन 'विजेता है। +1 @ एमीर, '$' एक गॉचा है। – markdsievers

+0

प्रश्न ने कहा "मैं * इस एक्सएमएल विन्यास को स्प्रिंग एनोटेशन के साथ * प्रतिस्थापित करना चाहता हूं।" फिर भी यहां अभी भी कॉन्फ़िगर एक्सएमएल है। क्या इसका मतलब है कि आप स्प्रिंग में पूरी तरह से एनोटेशन के साथ ऐसा नहीं कर सकते हैं? – Jonik

1

होना चाहिए:

public class Mick { 

    private Map<MyEnum, OtherObj> myMap; 

    @Autowired 
    public void setMyMap(Map<MyEnum, OtherObj> myMap) { 
    this.myMap = myMap; 
    } 
} 

अपडेट किया गया http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config

पर एक नज़र डालें

समस्या यह है कि util स्कीमा के अनुसार, आप कुंजी निर्दिष्ट नहीं कर सकते है या मूल्य प्रकार। हालांकि आप अपने आप के MapFactoryBean को लागू कर सकते हैं (केवल org.springframework.beans.factory.config.MapFactoryBean से प्राप्त)। एक छत - ध्यान दें कि जेनेरिक परिभाषा (यहां तक ​​कि रनटाइम में भी सोचा गया विचार) रास्ते में नहीं मिलता है।

+0

हाय डेविड, मुझे @Autowired एनोटेशन के बारे में पता है। यहां समस्या यह है कि यदि मैं नक्शा को स्वचालित करता हूं तो स्प्रिंग एबीसी को MyEnum.ABC ऑब्जेक्ट के रूप में पहचानने में सक्षम नहीं है। एक्सएमएल कॉन्फ़िगरेशन के साथ यह ठीक काम करता है, एनोटेशन कॉन्फ़िगरेशन के साथ यह इस अपवाद नेस्टेड अपवाद फेंक रहा है org.springframework.beans.FatalBeanException: मानचित्र का प्रकार [java.util.Map] [जावा .util.Map] को [जावा। lang.String] – mickthompson

+0

मैंने अपना जवाब अपडेट कर दिया है। –

0

<util:map> तत्व में कुंजी-प्रकार, resp। मूल्य-प्रकार विशेषताओं, जो कुंजी, वर्ग की कक्षा का प्रतिनिधित्व करता है। मूल्य। यदि आप कुंजी-प्रकार विशेषता में अपने enum की पूरी तरह से योग्य श्रेणी निर्दिष्ट करते हैं, तो नक्शा बनाने के दौरान कुंजी को उस enum में पार्स किया जाता है।

वसंत इंजेक्शन के दौरान सत्यापित करता है कि नक्शा की कुंजी और मूल्य प्रकार - नक्शा युक्त कक्षा में घोषित किया गया है- मानचित्र बीन की कुंजी और मूल्य प्रकारों के साथ असाइनमेंट-संगत है। यह वास्तव में है जहां से आप अपवाद प्राप्त करते हैं।

15

इसने मुझे फिट बैठ दिया लेकिन मैं इसे डेविड के उत्तर और कुछ अन्य लिंक (नीचे) का उपयोग करके एक साथ टुकड़ा करने में सक्षम था।

  • MapFactoryBean घोषणा में गुणों के नामों को न बदलें।
  • सुनिश्चित करें कि कुंजी-प्रकार विशेषता एनम को इंगित करती है जिसे आप मानचित्र में एक कुंजी के रूप में उपयोग करना चाहते हैं।

कक्षा

@Component 
public class MyClass { 

    private Map<MyEnum, ValueObjectInterface> valueMap; 

    @Autowired 
    public void setValueMap(final Map<MyEnum, ValueObjectInterface> valueMap) { 
     this.valueMap= valueMap; 
    } 


} 

Enum

public enum MyEnum{ 
    FOO ("FOO"), 
    BAR ("BAR"), 
    BAZ ("BAZ"); 
} 

एक्सएमएल कॉन्फ़िग फ़ाइल:

<bean id="valueMap" class="org.springframework.beans.factory.config.MapFactoryBean"> 
    <property name="targetMapClass"> 
     <value>java.util.HashMap</value> 
    </property> 
    <property name="sourceMap"> 
     <map key-type="com.company.packagepath.MyEnum"> 
      <entry key="FOO" value-ref="valueObject1" /> 
      <entry key="BAR" value-ref="valueObject2" /> 
      <entry key="BAZ" value-ref="valueObject3" /> 
     </map> 
    </property> 
</bean> 

<bean id="valueObject1" class="com.company.packagepath.ValueObject1" /> 
<bean id="valueObject2" class="com.company.packagepath.ValueObject2" /> 
<bean id="valueObject3" class="com.company.packagepath.ValueObject3" /> 

लिंक

5

ऐप्लिकेशन संदर्भ

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd "> 

<bean id="myProvider" class="com.project.MapProvider"> 
    <property name="myMap" ref="myMap"/> 
</bean> 

<util:map id="myMap" key-type="com.project.MyEnum" value-type="com.project.ValueObject"> 
    <entry> 
     <key><value type="com.project.MyEnum">FOO</value></key> 
     <ref bean="objectValue1"/> 
    </entry> 
</util:map> 
</beans> 

जावा वर्ग

package com.project; 

public class MapProvider { 

    private Map<MyEnum, ValueObject> myMap; 

    public void setMyMap(Map<MyEnum, ValueObject> myMap) { 
     this.myMap = myMap; 
    } 
} 
+0

के साथ जाऊंगा उत्तर को आपके द्वारा यहां सूचीबद्ध किए गए कुछ और स्पष्टीकरण की आवश्यकता है। – Markus

+0

मैंने enum के साथ कुंजी के रूप में मानचित्र बनाया है और इसे सेटटर तर्क के लिए उपयोग किया है। मैंने सोचा कि यह स्पष्ट है :) –

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