Wie kann ich der Eigenschaft von Bean einen Enum-Wert in der Spring-Konfigurationsdatei zuweisen?

109

Ich habe einen eigenständigen Aufzählungstyp definiert, ungefähr so:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Jetzt möchte ich einen Wert dieses Typs in eine Bean-Eigenschaft einfügen:

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

... und das hat nicht funktioniert :(

Wie soll ich eine Enum in eine Frühlingsbohne injizieren?

Xelurg
quelle

Antworten:

129

Haben Sie nur "TYPE1" ausprobiert? Ich nehme an, Spring verwendet Reflection, um den Typ des "Typs" zu bestimmen, sodass der vollständig qualifizierte Name redundant ist. Spring abonniert Redundanz im Allgemeinen nicht!

Krosenvold
quelle
1
Ziemlich seltsam, dass der vollqualifizierte Name nicht funktioniert.
Ryan Stull
Aber was ist, wenn ich etwas wie "$ {tes.db.database: ORACLE}" verwenden möchte, dh eine Eigenschaft als Standard festlegen möchte. Es funktioniert nicht. Bitte helfen Sie
Shubhi224
39

Verwenden Sie das untergeordnete Element value anstelle des Wertattributs und geben Sie den Namen der Enum-Klasse an:

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

Der Vorteil dieses Ansatzes gegenüber dem reinen Schreiben value="ALIEN"besteht darin, dass er auch funktioniert, wenn Spring den tatsächlichen Typ der Aufzählung nicht aus der Eigenschaft ableiten kann (z. B. ist der deklarierte Typ der Eigenschaft eine Schnittstelle). Adaptiert von Araqnids Kommentar.

Tsering
quelle
6
Dies funktioniert, wenn Spring den tatsächlichen Typ der Aufzählung nicht aus der Eigenschaft ableiten kann (z. B. ist die Eigenschaft nur eine Schnittstelle)
araqnid
@araqnid: Guter Punkt. Ich habe mir erlaubt, es der Antwort hinzuzufügen.
Sleske
@Tsering: Kann ich Spring EL innerhalb des Wertetags verwenden? $ {abc: ALIEN}
Shubhi224
32

Ich weiß, dass dies eine sehr alte Frage ist, aber falls jemand nach einem neueren Weg sucht, verwenden Sie den Spring Util-Namespace:

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

Wie in der Federdokumentation beschrieben .

Lucas
quelle
11

Sie können einfach "TYPE1" machen.

Jacob Mattison
quelle
4

Dies ist, was es für mich getan hat MessageDeliveryMode ist die Aufzählung, die die Bean den Wert PERSISTENT haben wird:

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

Verwenden von SPEL und 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
quelle
1

Um genau zu sein, setzen Sie den Wert auf den Namen einer Konstante vom Aufzählungstyp, z. B. "TYPE1" oder "TYPE2" in Ihrem Fall, wie unten gezeigt. Und es wird funktionieren:

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

Sie können Bean-Editoren schreiben (Details finden Sie in den Spring Docs), wenn Sie weiteren Wert hinzufügen und in benutzerdefinierte Typen schreiben möchten.

Fortyrunner
quelle
0

Beispiel für eine Spring-Integration, Routing basierend auf einem Enum-Feld:

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.
quelle