Como atribuir à propriedade do bean um valor Enum no arquivo de configuração do Spring?

109

Tenho um tipo de enum autônomo definido, algo assim:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Agora, quero injetar um valor desse tipo em uma propriedade de bean:

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

... e não funcionou :(

Como devo injetar um Enum em um feijão de primavera?

Xelurg
fonte

Respostas:

129

Você tentou apenas "TYPE1"? Suponho que o Spring usa reflexão para determinar o tipo de "tipo" de qualquer maneira, então o nome totalmente qualificado é redundante. O Spring geralmente não aceita redundância!

Krosenvold
fonte
1
Muito estranho que o nome totalmente qualificado não funcione.
Ryan Stull
Mas e se eu quiser usar algo como "$ {tes.db.database: ORACLE}", ou seja, padronizar uma propriedade. Não funciona. Ajude
Shubhi224
39

Use o elemento filho de valor em vez do atributo de valor e especifique o nome da classe Enum:

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

A vantagem dessa abordagem sobre apenas escrever value="ALIEN"é que também funciona se o Spring não puder inferir o tipo real do enum da propriedade (por exemplo, o tipo declarado da propriedade é uma interface). Adaptado do comentário de araqnid.

Tsering
fonte
6
Isso funciona se o Spring não puder inferir o tipo real de enum da propriedade (por exemplo, a propriedade é apenas uma interface)
araqnid
@araqnid: Bom ponto. Tomei a liberdade de adicioná-lo à resposta.
sleske
@Tsering: Posso usar Spring EL na tag value? $ {abc: ALIEN}
Shubhi224
32

Eu sei que esta é uma pergunta muito antiga, mas caso alguém esteja procurando a maneira mais nova de fazer isso, use o namespace spring util:

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

Conforme descrito na documentação da primavera .

Lucas
fonte
11

Você pode apenas fazer "TYPE1".

Jacob Mattison
fonte
4

Isso é o que fez para mim MessageDeliveryMode é o enum que o bean terá o valor PERSISTENT:

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

Usando SPEL e 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
fonte
1

Para ser específico, defina o valor como o nome de uma constante do tipo enum, por exemplo, "TYPE1" ou "TYPE2" no seu caso, conforme mostrado abaixo. E vai funcionar:

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

Você pode escrever Editores de Bean (os detalhes estão no Spring Docs) se quiser adicionar mais valor e escrever em tipos personalizados.

Fortyrunner
fonte
0

Exemplo de integração Spring, roteamento baseado em um campo 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
fonte