2009-02-05 17 views
100

Tengo un tipo de enumeración independiente definida, algo como esto:¿Cómo se asigna la propiedad de bean a un valor Enum en el archivo de configuración de Spring?

package my.pkg.types; 

public enum MyEnumType { 
    TYPE1, 
    TYPE2 
} 

Ahora, yo quiero para 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 que didn 't trabajar :(

¿Cómo debo Inyectar una enumeración en un grano de primavera?

Respuesta

118

Ha intentado simplemente 'TIPO 1'? supongo primavera utiliza la reflexión para determinar t El tipo de "tipo" de todos modos, por lo que el nombre completo parece redundante. Debo admitir que estoy adivinando, pero la primavera en general no se suscribe a la redundancia;)

+0

Su conjetura es correcta. Esto funciona. –

11

Puede hacer "TYPE1".

0

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

36

utilizar el elemento de valor del niño en lugar del atributo de valor y especifique el nombre de la clase de enumeración:

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

La ventaja de este enfoque sobre la escritura justa value="ALIEN" es que también funciona si la primavera no puede deducir el actual tipo de la enumeración de la propiedad (por ejemplo, el tipo declarado de la propiedad es una interfaz). Adaptado del comentario de araqnid.

+5

Esto funciona si Spring no puede inferir el tipo real de la enumeración de la propiedad (por ejemplo, la propiedad es solo una interfaz) – araqnid

+0

@araqnid: Buen punto. Me tomé la libertad de agregarlo a la respuesta. – sleske

29

Sé que esto es una pregunta muy viejo, pero en caso de que alguien está buscando la manera nueva de hacer esto, utilice la primavera util espacio de nombres:

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

Como se describe en el spring documentation.

+2

esta es una vieja pregunta, pero solo "TYPE1" todavía funciona. – eis

4

Esto es lo que hizo por mí MessageDeliveryMode es la enumeración del grano tendrá el valor PERSISTENTE:

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

ejemplo Primavera-integración, enrutamiento basado en un un campo de enumeración:

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> 
3

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

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

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