Jak przypisać właściwości beana wartość Enum w pliku konfiguracyjnym Spring?

109

Mam zdefiniowany samodzielny typ wyliczeniowy, coś takiego:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Teraz chcę wstrzyknąć wartość tego typu do właściwości fasoli:

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

... i to nie zadziałało :(

Jak wstrzyknąć Enum do fasoli jarskiej?

xelurg
źródło

Odpowiedzi:

129

Czy próbowałeś tylko „TYPE1”? Przypuszczam, że Spring i tak używa odbicia do określenia typu „typu”, więc w pełni kwalifikowana nazwa jest zbędna. Wiosna generalnie nie subskrybuje redundancji!

krosenvold
źródło
1
Dość dziwne, że w pełni kwalifikowana nazwa nie działa.
Ryan Stull
Ale co jeśli chcę użyć czegoś takiego jak „$ {tes.db.database: ORACLE}”, tj. Domyślnej właściwości. To nie działa. Proszę o pomoc
Shubhi224
39

Użyj elementu value child zamiast atrybutu value i określ nazwę klasy Enum:

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

Zaletą tego podejścia nad zwykłym pisaniem value="ALIEN"jest to, że działa również wtedy, gdy Spring nie może wywnioskować rzeczywistego typu wyliczenia z właściwości (np. Zadeklarowanym typem właściwości jest interfejs). Na podstawie komentarza araqnid.

Tsering
źródło
6
Działa to, jeśli Spring nie może wywnioskować rzeczywistego typu wyliczenia z właściwości (np. Właściwość jest tylko interfejsem)
araqnid
@araqnid: Słuszna uwaga. Pozwoliłem sobie dodać to do odpowiedzi.
sleske
@Tsering: Czy mogę używać Spring EL w tagu wartości? $ {abc: ALIEN}
Shubhi224,
32

Wiem, że to naprawdę stare pytanie, ale jeśli ktoś szuka nowszego sposobu, aby to zrobić, użyj przestrzeni nazw spring util:

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

Jak opisano w dokumentacji sprężyny .

Lucas
źródło
11

Możesz po prostu zrobić „TYPE1”.

Jacob Mattison
źródło
4

Oto, co zrobiłem dla mnie MessageDeliveryMode to wyliczenie, które fasola będzie miało wartość PERSISTENT:

<bean class="org.springframework.amqp.core.MessageDeliveryMode" factory-method="valueOf">
    <constructor-arg value="PERSISTENT" />
</bean>
Jerzy
źródło
4

Używanie SPEL i 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}"/>
Paul Rooney
źródło
1

Aby być konkretnym, ustaw jako wartość nazwę stałej typu wyliczenia, np. „TYPE1” lub „TYPE2” w twoim przypadku, jak pokazano poniżej. I zadziała:

<bean name="someName" class="my.pkg.classes">
   <property name="type" value="TYPE1" />
</bean>
Yuci
źródło
0

Możesz pisać Bean Editors (szczegóły w Spring Docs), jeśli chcesz dodać więcej wartości i pisać do niestandardowych typów.

Fortyrunner
źródło
0

Przykład integracji Spring, routing oparty na polu 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>
Mike R.
źródło