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

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

package my.pkg.types;


public enum MyEnumType {
TYPE1,
TYPE2
}

Now, I want to inject a value of that type into a bean property:

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

但是没有用

我应该如何注入一个 Enum 到一个春豆?

139243 次浏览

Have you tried just "TYPE1"? I suppose Spring uses reflection to determine the type of "type" anyway, so the fully qualified name is redundant. Spring generally doesn't subscribe to redundancy!

你可以只做“ TYPE1”。

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

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

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

这种方法的优势在于,如果 Spring 无法从属性中推断出枚举的实际类型(例如,属性声明的类型是一个接口) ,那么它也可以工作。改编自阿拉克尼德的评论

I know this is a really old question, but in case someone is looking for the newer way to do this, use the spring util namespace:

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

春季文件所述。

这就是为什么 MessageDeliveryMode 是 bean 的枚举,它的值为 PERSISTENT:

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

Spring-integration example, routing based on a an Enum field:

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>

使用 SPEL 和 P-名称空间:

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

具体来说,将该值设置为枚举类型的常量的名称,例如,在您的示例中为“ TYPE1”或“ TYPE2”,如下所示。它会奏效的:

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