首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring -如何在带注释的Map中设置枚举键

Spring -如何在带注释的Map中设置枚举键
EN

Stack Overflow用户
提问于 2009-07-23 20:34:33
回答 7查看 58.4K关注 0票数 42

我有一个枚举类

代码语言:javascript
运行
复制
public enum MyEnum{
    ABC;
}

那么我的“Mick”类就有这个属性

代码语言:javascript
运行
复制
private Map<MyEnum, OtherObj> myMap;

我有这个spring xml配置。

代码语言:javascript
运行
复制
<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 config切换到@Autowired注解(在Mick类的myMap属性上),Spring就会抛出这个异常

代码语言:javascript
运行
复制
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对象。

有什么想法吗?

谢谢

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-10-23 03:23:57

这对我很有效..。

我的Spring应用程序上下文:

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
public class MyClass {

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

需要注意的重要一点是,在Spring上下文中,我使用了SpEL (Spring Expression Language),它只在3.0版本之后才可用。在我的课堂上,我使用的是@Resource,既不是@Inject (它对我不起作用),也不是@Autowired (我没有尝试过这个)。我所知道的@Resource@Autowired之间唯一的区别是,前者按bean名称自动注入,而后者按bean类型自动注入。

享受吧!

票数 51
EN

Stack Overflow用户

发布于 2011-03-23 05:04:08

这个问题让我大吃一惊,但我可以使用David的答案和其他一些链接(如下所示)将其拼凑在一起。

对于

  • 类型属性指向要用作映射中的键的枚举的MapFactoryBean MapFactoryBean中的属性,请不要更改其名称。

代码语言:javascript
运行
复制
@Component
public class MyClass {

    private Map<MyEnum, ValueObjectInterface> valueMap;

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


}

枚举

代码语言:javascript
运行
复制
    public enum MyEnum{
    FOO ("FOO"),
    BAR ("BAR"),
    BAZ ("BAZ");
}

XML配置文件:

代码语言:javascript
运行
复制
<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" />

链接

票数 17
EN

Stack Overflow用户

发布于 2012-09-10 23:37:42

应用程序上下文

代码语言:javascript
运行
复制
<?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类

代码语言:javascript
运行
复制
package com.project;

public class MapProvider {

    private Map<MyEnum, ValueObject> myMap;

    public void setMyMap(Map<MyEnum, ValueObject> myMap) {
        this.myMap = myMap;
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1174308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档