如何在包含注释的Map中设置Enum键

我有一个Enum类

public enum MyEnum{
    ABC;
}

比我的'米克'类有这个属性

private Map<MyEnum, OtherObj> myMap;

我有这个春天的XML配置。

<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注释替换这个xml配置。
你有关于如何自动装配地图的想法吗?

这里的问题是,如果我从xml配置切换到@Autowired注释(在Mick类的myMap属性上),Spring会抛出此异常

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无法将字符串ABC识别为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(Spring表达式语言),它仅在3.0版本以后才可用。 在我的班级中,我使用@Resource ,@ @Inject (它不适用于我)和@Autowired (我没有试过这个)。 我知道@Resource@Autowired之间唯一的区别是,前者通过bean名称自动注入,而后者通过bean类型进行自动注入。

请享用!


这个给了我适合,但我可以用David的答案和其他一些链接(下面)将它拼凑在一起。

  • 不要更改MapFactoryBean声明中属性的名称。
  • 确保键类型属性指向您想要用作映射中键的枚举。
  • @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");
    }
    

    XML配置文件:

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

    链接

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

  • 应用上下文

    <?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;
        }
    }
    
    链接地址: http://www.djcxy.com/p/67717.html

    上一篇: How do you set Enum keys in a Map with annotations

    下一篇: How to separate spring contexts in intelliJ IDEA