¿Cómo asignar a la propiedad de bean un valor de enumeración en el archivo de configuración de Spring?

109

Tengo un tipo de enumeración independiente definido, algo como esto:

package my.pkg.types;

public enum MyEnumType {
    TYPE1,
    TYPE2
}

Ahora, quiero inyectar un valor de ese tipo en una propiedad de bean:

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

... y eso no funcionó :(

¿Cómo debo inyectar un Enum en un frijol de primavera?

xelurg
fuente

Respuestas:

129

¿Has probado solo "TYPE1"? Supongo que Spring usa la reflexión para determinar el tipo de "tipo" de todos modos, por lo que el nombre completo es redundante. ¡Spring generalmente no se suscribe a la redundancia!

krosenvold
fuente
1
Es bastante extraño que el nombre completo no funcione.
Ryan Stull
Pero, ¿qué pasa si quiero usar algo como "$ {tes.db.database: ORACLE}", es decir, establecer una propiedad por defecto? No funciona. Por favor ayuda
Shubhi224
39

Utilice el elemento secundario value en lugar del atributo value y especifique el nombre de la clase Enum:

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

La ventaja de este enfoque sobre la simple escritura value="ALIEN"es que también funciona si Spring no puede inferir el tipo real de la enumeración de la propiedad (por ejemplo, el tipo declarado de la propiedad es una interfaz). Adaptado del comentario de Araqnid.

Tsering
fuente
6
Esto funciona si Spring no puede inferir el tipo real de enumeración de la propiedad (por ejemplo, la propiedad es solo una interfaz)
araqnid
@araqnid: Buen punto. Me tomé la libertad de agregarlo a la respuesta.
sleske
@Tsering: ¿Puedo usar Spring EL dentro de la etiqueta de valor? $ {abc: ALIEN}
Shubhi224
32

Sé que esta es una pregunta muy antigua, pero en caso de que alguien esté buscando la forma más nueva de hacer esto, use el espacio de nombres spring util:

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

Como se describe en la documentación de primavera .

Lucas
fuente
11

Puedes simplemente hacer "TYPE1".

Jacob Mattison
fuente
4

Esto es lo que hizo por mí MessageDeliveryMode es la enumeración que el bean tendrá el valor PERSISTENT:

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

Usando SPEL y 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
fuente
1

Para ser específico, establezca el valor para que sea el nombre de una constante del tipo de enumeración, por ejemplo, "TYPE1" o "TYPE2" en su caso, como se muestra a continuación. Y funcionará:

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

Puede escribir Bean Editors (los detalles están en Spring Docs) si desea agregar más valor y escribir en tipos personalizados.

Fortyrunner
fuente
0

Ejemplo de integración de Spring, enrutamiento basado en un 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
fuente