¿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?

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!


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.


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 .



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>

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

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>

0

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


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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.