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?

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!


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.


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 .



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>

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}"/>

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>

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.


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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.