Как назначить свойству бина значение Enum в конфигурационном файле Spring? - PullRequest
103 голосов
/ 05 февраля 2009

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

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Теперь я хочу добавить значение этого типа в свойство компонента:

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

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

Как мне ввести Enum в бобовые?

Ответы [ 9 ]

124 голосов
/ 05 февраля 2009

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

38 голосов
/ 28 января 2010

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

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

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

30 голосов
/ 12 июля 2012

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

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

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

11 голосов
/ 05 февраля 2009

Вы можете просто сделать «ТИП1».

4 голосов
/ 17 июня 2015

Использование 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}"/>
4 голосов
/ 04 июля 2013

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

<bean class="org.springframework.amqp.core.MessageDeliveryMode" factory-method="valueOf">
    <constructor-arg value="PERSISTENT" />
</bean>
0 голосов
/ 03 февраля 2017

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

<bean name="someName" class="my.pkg.classes">
   <property name="type" value="TYPE1" />
</bean>
0 голосов
/ 20 августа 2013

Пример интеграции с 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>
0 голосов
/ 07 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...