如何在Spring配置文件中为bean的属性分配一个Enum值?

时间:2009-02-05 16:52:29

标签: java spring

我定义了一个独立的枚举类型,如下所示:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

现在,我想将该类型的值注入bean属性:

<bean name="someName" class="my.pkg.classes">
   <property name="type" value="my.pkg.types.MyEnumType.TYPE1" />
</bean>

......那不起作用:(

我应该如何将一个枚举注入一个春豆?

9 个答案:

答案 0 :(得分:124)

您是否尝试过“TYPE1”?我想Spring总是使用反射来确定“类型”的类型,因此完全限定名称是多余的。 Spring通常不会订阅冗余!

答案 1 :(得分:38)

使用value子元素而不是value属性并指定Enum类名:

<property name="residence">
    <value type="SocialSecurity$Residence">ALIEN</value>
</property>

这种方法优于编写value="ALIEN"的优点是,如果Spring无法从属性中推断枚举的实际类型(例如,属性的声明类型是接口),它也可以工作。 改编自araqnid的评论。

答案 2 :(得分:30)

我知道这是一个非常古老的问题,但如果有人正在寻找更新的方法,请使用spring util命名空间:

<util:constant static-field="my.pkg.types.MyEnumType.TYPE1" />

spring documentation中所述。

答案 3 :(得分:11)

你可以做“TYPE1”。

答案 4 :(得分:4)

这就是为我做的事MessageDeliveryMode是枚举bean将具有值PERSISTENT:

<bean class="org.springframework.amqp.core.MessageDeliveryMode" factory-method="valueOf">
    <constructor-arg value="PERSISTENT" />
</bean>

答案 5 :(得分:4)

使用SPEL和P-NAMESPACE:

<beans...
xmlns:p="http://www.springframework.org/schema/p" ...>
..
<bean name="someName" class="my.pkg.classes"
    p:type="#{T(my.pkg.types.MyEnumType).TYPE1}"/>

答案 6 :(得分:0)

如果要添加更多值并写入自定义类型,可以编写Bean编辑器(详细信息在Spring文档中)。

答案 7 :(得分:0)

Spring-integration示例,基于Enum字段的路由:

public class BookOrder {

    public enum OrderType { DELIVERY, PICKUP } //enum
    public BookOrder(..., OrderType orderType) //orderType
    ...

配置:

<router expression="payload.orderType" input-channel="processOrder">
    <mapping value="DELIVERY" channel="delivery"/>
    <mapping value="PICKUP" channel="pickup"/>
</router>

答案 8 :(得分:0)

具体而言,将值设置为枚举类型常量的名称,例如,在您的情况下为“TYPE1”或“TYPE2”,如下所示。它会起作用:

<bean name="someName" class="my.pkg.classes">
   <property name="type" value="TYPE1" />
</bean>