如何在Springconfiguration文件中赋予bean的属性一个枚举值?

我有一个独立的枚举types定义,如下所示:

package my.pkg.types; public enum MyEnumType { TYPE1, TYPE2 } 

现在,我想把这个types的值注入到一个bean属性中:

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

…并没有工作:(

我应该如何将一个枚举注入一个spring bean?

你有没有尝试过“TYPE1”? 我想springreflection来决定“types”的types,所以完全合格的名称似乎是多余的。 我必须承认我在猜测,但spring通常不会订阅冗余;)

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

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

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

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

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

如在春季文档中所述 。

你可以做“TYPE1”。

这是我做了什么MessageDeliveryMode是枚举bean将有值PERSISTENT:

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

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

如果你想添加更多的值并写入自定义的types,你可以编写Bean Editors(细节在Spring文档中)。

Spring集成示例,基于Enum字段的路由:

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

configuration:

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

具体而言,将值设置为枚举types的常量的名称,例如“TYPE1”或“TYPE2”,如下所示。 这将工作:

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