spring – 你如何设置带有注释的地图中的枚举键

我有一个枚举类

public enum MyEnum{ ABC; } 

比我的“米克”类有这个属性

 private Map<MyEnum, OtherObj> myMap; 

我有这个spring的XMLconfiguration。

 <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> 

这很好。
我想用Spring注释replace这个xmlconfiguration。
你有什么想法如何自动assembly地图?

这里的问题是,如果我从xmlconfiguration切换到@Autowired注释(在Mick类的myMap属性上),Spring将引发此exception

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

Spring无法将stringABC识别为MyEnum.ABC对象。
任何想法?

谢谢

这对我工作…

我的Spring应用程序上下文

 <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; } 

需要注意的重要的事情是,在Spring上下文中,我使用了SpEL(Springexpression式语言),它只能从3.0版本开始使用。 而在我的课堂上,我使用@Resource ,@ @Inject (它不适用于我)和@Autowired (我没有尝试这个)。 我知道@Resource@Autowired之间的唯一区别是,前者是通过bean名自动注入的,而后者是通过bean类来注入的。

请享用!

这一个给了我适合,但我能够使用大卫的答案和其他一些链接(下)。

  • 不要更改MapFactoryBean声明中的属性名称。
  • 确保键types属性指向您想要在映射中用作键的枚举。

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

枚举

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

XMLconfiguration文件:

 <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" /> 

链接

  • 代码牧场
  • Spring的MapFactoryBean示例在mkyong.com
  • 如何在Springconfiguration文件中赋予bean的属性一个枚举值?

应用上下文

 <?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> 

Java类

 package com.project; public class MapProvider { private Map<MyEnum, ValueObject> myMap; public void setMyMap(Map<MyEnum, ValueObject> myMap) { this.myMap = myMap; } } 

应该:

 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模式,您不能指定键或值types。 但是,您可以实现自己的MapFactoryBean(仅从org.springframework.beans.factory.config.MapFactoryBeaninheritance)。 一个ceveat – 注意通用定义(即使在运行时被删除)也不会阻碍。

<util:map>元素具有键types, 值types属性,表示键的类别, 价值。 如果您在键types属性中指定了枚举的完全限定类,那么在创build映射时键将被parsing为该枚举。

Spring在注入过程中validation映射的键和值types(在包含映射的类中声明)与映射bean的键和值types是分配兼容的。 这实际上是你从哪里得到的例外。