Как присвоить свойство bean значение Enum в файле конфигурации Spring?

У меня есть определенный тип перечисления, что-то вроде этого:

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>

... и это не сработало: (

Как мне вложить Enum в spring bean?

Ответ 1

Вы пробовали просто "TYPE1"? Я полагаю, что spring использует отражение для определения типа "type", так что полное имя кажется излишним. Должен признаться, я предполагаю, но spring вообще не подписывается на избыточность;)

Ответ 2

Используйте дочерний элемент значения вместо атрибута value и укажите имя класса Enum:

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

Преимущество этого подхода в отношении простого написания value="ALIEN" заключается в том, что он также работает, если Spring не может вывести фактический тип перечисления из свойства (например, объявленный тип свойства является интерфейсом). Адаптировано из комментария araqnid.

Ответ 3

Я знаю, что это действительно старый вопрос, но если кто-то ищет новый способ сделать это, используйте пространство имен spring util:

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

Как описано в spring документации.

Ответ 4

Вы можете просто сделать "TYPE1".

Ответ 5

Вот что мне для меня MessageDeliveryMode является перечисление bean будет иметь значение PERSISTENT:

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

Ответ 6

Использование 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}"/>

Ответ 7

Вы можете написать редакторы Bean (подробности приведены в Spring Docs), если вы хотите добавить дополнительное значение и записать в пользовательские типы.

Ответ 8

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>

Ответ 9

Чтобы быть конкретным, задайте значение как имя константы типа перечисления, например, "ТИП 1" или "ТИП 2" в вашем случае, как показано ниже. И он будет работать:

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