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


109

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

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>

...那行不通:(

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

Answers:


129

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


1
完全合格的名称不起作用很奇怪。
瑞安·斯托尔

但是,如果我想使用类似“ $ {tes.db.database:ORACLE}”之类的东西,即默认属性,该怎么办?它无法工作。请帮助
Shubhi224 '18

39

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

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

这种方法比仅编写方法的优势value="ALIEN"在于,如果Spring无法从属性推断枚举的实际类型(例如,属性的声明类型为接口),则该方法也适用。改编自araqnid的评论。


6
如果Spring无法从属性推断枚举的实际类型(例如,属性只是一个接口),则此方法有效
araqnid

@araqnid:好点。我随意将其添加到答案中。
sleske 2015年

@Tsering:我可以在value标签内使用Spring EL吗?$ {abc:ALIEN}
Shubhi224 '18

32

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

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

spring文档中所述



4

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

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

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

1

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

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

0

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


0

Spring集成示例,基于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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.