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

109

У меня определен автономный тип перечисления, примерно так:

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?

xelurg
источник

Ответы:

129

Вы пробовали просто "TYPE1"? Я полагаю, Spring в любом случае использует отражение для определения типа "типа", поэтому полное имя является избыточным. Spring вообще не поддерживает избыточность!

Кросенвольд
источник
1
Довольно странно, что полное имя не работает.
Райан Стулл
Но что, если я захочу использовать что-то вроде «$ {tes.db.database: ORACLE}», т.е. установить свойство по умолчанию. Это не работает. Пожалуйста, помогите
Shubhi224 09
39

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

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

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

Церин
источник
6
Это работает, если Spring не может вывести фактический тип перечисления из свойства (например, свойство - это просто интерфейс)
araqnid
@araqnid: Хорошее замечание. Я взял на себя смелость добавить его к ответу.
sleske
@Tsering: Могу ли я использовать Spring EL в теге значения? $ {abc: ALIEN}
Shubhi224,
32

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

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

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

Лукас
источник
11

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

Джейкоб Мэттисон
источник
4

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

<bean class="org.springframework.amqp.core.MessageDeliveryMode" factory-method="valueOf">
    <constructor-arg value="PERSISTENT" />
</bean>
Джордж
источник
4

Использование 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}"/>
Пол Руни
источник
1

Чтобы быть конкретным, установите значение как имя константы типа перечисления, например, «TYPE1» или «TYPE2» в вашем случае, как показано ниже. И будет работать:

<bean name="someName" class="my.pkg.classes">
   <property name="type" value="TYPE1" />
</bean>
Юйцы
источник
0

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

Fortyrunner
источник
0

Пример 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>
Майк Р
источник