Come assegnare alla proprietà del bean un valore Enum nel file di configurazione Spring?


109

Ho definito un tipo di enumerazione autonomo, qualcosa del genere:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Ora, voglio iniettare un valore di quel tipo in una proprietà bean:

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

... e non ha funzionato :(

Come dovrei iniettare un Enum in un fagiolo primaverile?

Risposte:


129

Hai provato solo "TYPE1"? Suppongo che Spring utilizzi la reflection per determinare comunque il tipo di "tipo", quindi il nome completo è ridondante. La primavera generalmente non si abbona alla ridondanza!


1
È piuttosto strano che il nome completo non funzioni.
Ryan Stull

Ma cosa succede se voglio usare qualcosa come "$ {tes.db.database: ORACLE}", cioè l'impostazione predefinita di una proprietà. Non funziona. Per favore
aiutatemi

39

Utilizza l'elemento figlio value invece dell'attributo value e specifica il nome della classe Enum:

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

Il vantaggio di questo approccio rispetto alla semplice scrittura value="ALIEN"è che funziona anche se Spring non può dedurre il tipo effettivo di enum dalla proprietà (ad esempio, il tipo dichiarato della proprietà è un'interfaccia). Adattato dal commento di araqnid.


6
Funziona se Spring non è in grado di dedurre il tipo effettivo di enum dalla proprietà (ad esempio, la proprietà è solo un'interfaccia)
araqnid

@araqnid: buon punto. Mi sono preso la libertà di aggiungerlo alla risposta.
Sleske

@Tsering: Posso usare Spring EL all'interno di un value tag? $ {abc: ALIEN}
Shubhi224

32

So che questa è una domanda molto vecchia, ma nel caso qualcuno stia cercando il modo più nuovo per farlo, usa lo spazio dei nomi spring util:

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

Come descritto nella documentazione di primavera .



4

Questo è ciò che ha fatto per me MessageDeliveryMode è l'enumerazione il bean avrà il valore PERSISTENT:

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

4

Utilizzando SPEL e 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

Per essere precisi, imposta il valore in modo che sia il nome di una costante del tipo enum, ad esempio "TYPE1" o "TYPE2" nel tuo caso, come mostrato di seguito. E funzionerà:

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

0

Puoi scrivere Bean Editors (i dettagli sono in Spring Docs) se vuoi aggiungere ulteriore valore e scrivere su tipi personalizzati.


0

Esempio di integrazione di primavera, instradamento basato su un campo 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.