Как присвоить свойству 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>


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



Как я должен ввести перечисление в весенний Боб?

646   9  

9 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

Spring-пример интеграции, маршрутизация на основе поля перечисления:

public class BookOrder {

    public enum OrderType { DELIVERY, PICKUP } //enum
    public BookOrder(..., OrderType orderType) //orderType
    ...

config:

<router expression="payload.orderType" input-channel="processOrder">
    <mapping value="DELIVERY" channel="delivery"/>
    <mapping value="PICKUP" channel="pickup"/>
</router>

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

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

Comments

    Ничего не найдено.