Comment attribuer à la propriété du bean une valeur Enum dans le fichier de configuration Spring?

109

J'ai un type d'énumération autonome défini, quelque chose comme ceci:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Maintenant, je veux injecter une valeur de ce type dans une propriété de bean:

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

... et cela n'a pas fonctionné :(

Comment dois-je injecter un Enum dans un haricot de printemps?

Xelurg
la source

Réponses:

129

Avez-vous simplement essayé "TYPE1"? Je suppose que Spring utilise de toute façon la réflexion pour déterminer le type de «type», de sorte que le nom complet est redondant. Spring ne souscrit généralement pas à la redondance!

Krosenvold
la source
1
Assez étrange que le nom complet ne fonctionne pas.
Ryan Stull
Mais que faire si je veux utiliser quelque chose comme "$ {tes.db.database: ORACLE}", c'est-à-dire la valeur par défaut d'une propriété. Cela ne fonctionne pas. S'il vous plaît aider
Shubhi224
39

Utilisez l'élément enfant value au lieu de l'attribut value et spécifiez le nom de classe Enum:

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

L'avantage de cette approche par rapport à la simple écriture value="ALIEN"est qu'elle fonctionne également si Spring ne peut pas déduire le type réel de l'énumération à partir de la propriété (par exemple, le type déclaré de la propriété est une interface). Adapté du commentaire d'Araqnid.

Tsering
la source
6
Cela fonctionne si Spring ne peut pas déduire le type réel de l'énumération à partir de la propriété (par exemple, la propriété est juste une interface)
araqnid
@araqnid: Bon point. J'ai pris la liberté de l'ajouter à la réponse.
sleske
@Tsering: Puis-je utiliser Spring EL dans la balise value? $ {abc: ALIEN}
Shubhi224
32

Je sais que c'est une question très ancienne, mais au cas où quelqu'un chercherait la nouvelle façon de le faire, utilisez l'espace de noms spring util:

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

Comme décrit dans la documentation du printemps .

Lucas
la source
11

Vous pouvez simplement faire "TYPE1".

Jacob Mattison
la source
4

C'est ce qui a fait pour moi MessageDeliveryMode est l'énumération que le bean aura la valeur PERSISTENT:

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

Utilisation de SPEL et 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
la source
1

Pour être précis, définissez la valeur comme étant le nom d'une constante de type enum, par exemple "TYPE1" ou "TYPE2" dans votre cas, comme indiqué ci-dessous. Et cela fonctionnera:

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

Vous pouvez écrire des éditeurs de bean (les détails se trouvent dans la documentation Spring) si vous souhaitez ajouter de la valeur et écrire dans des types personnalisés.

Fortyrunner
la source
0

Exemple d'intégration Spring, routage basé sur un champ 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
la source