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?

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!


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.


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 .



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>

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

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>

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.


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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.