如何在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>