【问题标题】:Spring 3.2.4 can't convert String to Enum in <util:map.../> although 'key-type' is specifiedSpring 3.2.4 无法在 <util:map.../> 中将 String 转换为 Enum,尽管指定了“key-type”
【发布时间】:2015-01-12 20:37:21
【问题描述】:

我正在尝试使用 Spring 3.2.4 定义一个映射 bean,其中 Enum 作为键类型,这样:

<util:map id="myMapping" key-type="com.acme.MyEnum">
    <entry key="ENUM1" value="value1" />
    <entry key="ENUM2" value="value2" />
</util:map>

MyEnum 类是一个普通的类:

public enum MyEnum
{
    ENUM1,
    ENUM2
}

在创建应用上下文时,Spring 抛出这个异常:

org.springframework.beans.factory.BeanCreationException:

  Error creating bean with name 'myMapping':

    Error converting typed String value for bean property 'sourceMap';
    nested exception is org.springframework.beans.ConversionNotSupportedException:

    Failed to convert value of type 'java.lang.String' to required type
    'com.acme.MyEnum'; nested exception is java.lang.IllegalStateException:

      Cannot convert value of type [java.lang.String] to required type 
      [com.acme.MyEnum]: no matching editors or conversion strategy found

(为了更好的可读性而格式化)

由于给定的键类型,我希望 Spring 将字符串“ENUM1”转换为“MyEmum.ENUM1”

key-type="com.acme.MyEnum"

在映射 bean 声明中。

我知道如何通过使用&lt;entry&gt;、使用枚举的全限定类名等来做一个备用 bean 定义来解决这个问题......但我想按照描述的方式构建定义以便于阅读。

这是一个已知的错误还是我缺乏理解?

非常感谢您的帮助!

【问题讨论】:

    标签: java xml spring map enums


    【解决方案1】:

    您可以尝试使用此策略进行字符串转换。

    public enum MyEnum
    {
        ENUM1("ENUM1"),
        ENUM2("ENUM2")
    }
    

    【讨论】:

    • 感谢您的回答,但我无法更改要在实际生产代码中使用的枚举。
    【解决方案2】:

    实际上,你如何使用 utils-map 似乎是正确的,但问题可能出在其他地方。

    我不知道你如何注入创建的 myMapping bean。如果您使用@Autowired,这可能是您收到此异常的原因。您应该使用@Resource(name="myMapping") 而不是@Autowired。 See this ticket.

    我已经对其进行了测试,并且可以正常工作。如果你想看看如何,我创建了一个示例项目并推送到 github。 Follow this link.

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答,但这与注入地图无关。在创建应用程序上下文期间抛出异常。在任何注入发生之前很久就无法创建bean“myMapping”。您使用哪个 Spring 版本?
    • 好的,在 GitHub 项目中看到了你的 Spring 版本。仍然无法解释为什么我的项目会出现问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2011-07-18
    相关资源
    最近更新 更多