如何在Spring应用程序上下文中注入Jakarta枚举?

时间:2008-11-24 16:24:49

标签: java spring enums

我有一个构造函数需要Jakarta enums的类。我试图找到如何通过Spring XML aplicationContext轻松注入它。

例如:

枚举:

public class MyEnum extends org.apache.commons.lang.enums.Enum {
    public static final MyEnum MY_FIRST_VALUE = new MyEnum("MyFirstValue");
    public static final MyEnum MY_SECOND_VALUE = new MyEnum("MySecondValue");

    public static MyEnum getEnum(String name) {
        return (MyEnum) getEnum(MyEnum.class, name);
    }
    [...other standard enum methods]
}

要注入的类:

public class MyService {
    private final MyEnum status;
    public MyService(MyEnum status) {
        this.status = status;
    }
}

应用程序上下文:

<bean id="myService" class="MyService">
    <constructor-arg index="0" value="MyFirstValue" />
</bean>

当然,我有一个no matching editors or conversion strategy found错误。 Spring和Jakarta枚举之间是否有一个简单的集成?或者我应该编写自己的PropertyEditor吗?

3 个答案:

答案 0 :(得分:3)

查看Spring中的<util:constant>标记。它将要求您将架构添加到xml定义中。所以你最终会得到以下结论:

<bean id="myService" class="MyService">
  <constructor-arg index="0">
    <util:constant static-field="MyEnum.MY_FIRST_VALUE"/>
  </constructor-arg>
</bean>

找到标签的定义和用法(包括XSD def)here

答案 1 :(得分:1)

我找到了一个解决方案,但它非常冗长(根本不符合我的口味):

<bean id="myService" class="MyService">
    <constructor-arg index="0">
        <bean class="MyEnum" factory-method="getEnum">
            <constructor-arg value="MyFirstValue" />
        </bean>
    </constructor-arg>
</bean>

答案 2 :(得分:0)

我投了斯宾塞的答案,但发现这也会有效。在此示例中,您只需在constructor-arg中指定索引,键入名称

<bean id="myService" class="MyService">
<constructor-arg index="0" type="com.package.MyEnum" value="MyFirstValue" />
</bean>

我的基础是我收到的错误信息:

  

(提示:为简单参数指定索引/类型/名称参数以避免类型歧义)