Як призначити властивості 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>

... і це не спрацювало :(

Як я повинен вводити «Енум» у весняний боб?

Відповіді:


129

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


1
Досить дивно, що повноцінне ім’я не працює.
Райан Стюлл

Але що робити, якщо я хочу використовувати щось на зразок "$ {tes.db.database: ORACLE}", тобто дефолт властивості. Він не спрацьовує. Будь ласка, допоможіть
Shubhi224

39

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

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

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


6
Це спрацьовує, якщо Spring не зможе визначити фактичний тип перерахунку з властивості (наприклад, властивість - це лише інтерфейс)
araqnid

@araqnid: Добре. Я взяв на себе сміливість додати це до відповіді.
sleske

@Tsering: Чи можу я використовувати Spring EL в тезі значення? $ {abc: ALIEN}
Shubhi224

32

Я знаю, що це справді старе питання, але у випадку, якщо хтось шукає новіший спосіб зробити це, використовуйте простір імен Spring util:

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

Як описано у весняній документації .



4

Це те, що зробив це для мене MessageDeliveryMode - це перерахунок, що боб матиме значення ПЕРСИСТЕНТ:

<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

Щоб бути конкретним, встановіть значення, яке буде ім'ям константи типу enum, наприклад, "TYPE1" або "TYPE2" у вашому випадку, як показано нижче. І це спрацює:

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

0

Ви можете написати редактори Bean (деталі наведені у весняних документах), якщо ви хочете додати додаткову цінність та писати на власні типи.


0

Приклад інтеграції весни, маршрутизація на основі поля Enum:

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.