114 votes

Comment attribuer une valeur Enum à une propriété d'un bean dans le fichier de configuration de Spring ?

J'ai défini un type d'enum autonome, 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é du haricot :

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

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

Comment injecter un Enum dans un Spring Bean ?

133voto

krosenvold Points 35979

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

1 votes

Plutôt étrange que le nom entièrement qualifié ne fonctionne pas.

0 votes

Mais que faire si je veux utiliser quelque chose comme "${tes.db.database:ORACLE}". c'est-à-dire en définissant une propriété par défaut. Cela ne fonctionne pas. Merci de m'aider.

46voto

Tsering Points 269

Utilisez l'élément enfant value au lieu de l'attribut value et spécifiez le nom de la 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 que cela fonctionne également si Spring ne peut pas déduire le type réel de l'enum à partir de la propriété (par exemple, le type déclaré de la propriété est une interface). <em>Adapté du commentaire d'araqnid.</em>

6 votes

Cela fonctionne si Spring ne peut pas déduire le type réel de l'enum à partir de la propriété (par exemple, la propriété est juste une interface).

0 votes

@araqnid : Bon point. J'ai pris la liberté de l'ajouter à la réponse.

0 votes

@Tsering : Puis-je utiliser Spring EL dans la balise value ? ${abc:ALIEN}

35voto

Lucas Points 4891

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

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

Comme décrit dans le documentation sur le printemps .

12voto

Jacob Mattison Points 32137

Vous pouvez simplement faire "TYPE1".

6voto

George Points 36

C'est ce qui a fonctionné pour moi MessageDeliveryMode est l'enum, le haricot aura la valeur PERSISTENT :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X