2009-02-05 6 views
100

Mam samodzielny typ enum zdefiniowane, coś takiego:Jak przypisać właściwość fasoli wartość Enum w pliku konfiguracyjnym Spring?

package my.pkg.types; 

public enum MyEnumType { 
    TYPE1, 
    TYPE2 
} 

Teraz chcę, aby wprowadzić wartość tego typu w nieruchomości Fasola:

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

... i że didn „t działać :(

Jak należy wstrzyknąć wyliczenia na fasoli wiosny?

Odpowiedz

118

Czy próbowałeś tylko«TYPE1»? Przypuszczam, że sprężyna używa odbicie w celu określenia t w każdym razie typu "typ", więc w pełni kwalifikowana nazwa wydaje się zbędna. Muszę przyznać, że zgaduję, ale wiosna na ogół nie subskrybuje redundancji;)

+0

Twoje przypuszczenie jest poprawne. To działa. –

11

Możesz po prostu zrobić "TYPE1".

0

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

36

Użyj elementu wartość dziecko zamiast atrybutu wartości i podać nazwę klasy Enum:

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

Zaletą tego podejścia na piśmie value="ALIEN" tylko jest to, że działa również jeśli wiosna nie można wywnioskować, rzeczywista typ wyliczenia z nieruchomości (np. zadeklarowany typ właściwości jest interfejsem). Dostosowano z komentarza araqnid.

+5

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

+0

@araqnid: Dobra uwaga. Wolałem dodać to do odpowiedzi. – sleske

29

wiem, że to jest bardzo stare pytanie, ale w przypadku, gdy ktoś szuka nowszej sposób to zrobić, należy sprężynę util nazw:

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

Jak opisano w spring documentation.

+2

to stare pytanie, ale tylko "TYPE1" nadal działa. – eis

4

To jest to, co zrobił dla mnie MessageDeliveryMode jest enum fasola będzie miał wartość persistent:

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

przykład Wiosna-integracyjny, routing w oparciu o pola ENUM:

public class BookOrder { 

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

konfiguracji:

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

Stosując 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}"/> 
0

Aby być konkretnym, należy ustawić wartość na nazwę stałej typu wyliczeniowego, np. "TYP1" lub "TYP2" w danym przypadku, jak pokazano poniżej. I to zadziała:

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