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

xel*_*urg 105 java spring

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

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}
Run Code Online (Sandbox Code Playgroud)

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

<bean name="someName" class="my.pkg.classes">
   <property name="type" value="my.pkg.types.MyEnumType.TYPE1" />
</bean>
Run Code Online (Sandbox Code Playgroud)

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

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

kro*_*old 127

你试过"TYPE1"吗?我想Spring总是使用反射来确定"类型"的类型,因此完全限定名称是多余的.Spring一般不会订阅冗余!


小智 38

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

<property name="residence">
    <value type="SocialSecurity$Residence">ALIEN</value>
</property>
Run Code Online (Sandbox Code Playgroud)

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

  • 如果Spring无法从属性中推断枚举的实际类型(例如属性只是一个接口),这是有效的 (6认同)

Luc*_*cas 31

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

<util:constant static-field="my.pkg.types.MyEnumType.TYPE1" />
Run Code Online (Sandbox Code Playgroud)

弹簧文档中所述.

  • 这是一个老问题,但只是"TYPE1"仍然有效. (2认同)

Jac*_*son 11

你可以做"TYPE1".


小智 6

这就是为我做的 MessageDeliveryMode 是 bean 的枚举,其值为 PERSISTENT:

<bean class="org.springframework.amqp.core.MessageDeliveryMode" factory-method="valueOf">
    <constructor-arg value="PERSISTENT" />
</bean>
Run Code Online (Sandbox Code Playgroud)


小智 5

使用 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}"/>
Run Code Online (Sandbox Code Playgroud)