2012-08-16 38 views
54

Actualmente estoy usando la anotación 3.1.x @Valor primavera como esta:¿Puedo establecer nulo como valor predeterminado para @Value en Spring?

@Value("${stuff.value:}") 
private String value; 

Esto pone una cadena vacía en la variable si el atributo no está presente. Me gustaría tener nulo como predeterminado en lugar de una cadena vacía. Por supuesto, también quiero evitar un error cuando la propiedad stuff.value no está configurada.

Respuesta

46

Debe establecer nullValue del PropertyPlaceholderConfigurer. Por ejemplo, estoy usando la cadena @null pero también puede usar la cadena vacía como valor nulo.

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <!-- config the location(s) of the properties file(s) here --> 
    <property name="nullValue" value="@null" /> 
</bean> 

Ahora se puede utilizar la cadena @null para representar el valor null

@Value("${stuff.value:@null}") 
private String value; 

Tenga en cuenta: El espacio de nombre de contexto no soporta el valor nulo en el momento. No se puede utilizar

<context:property-placeholder null-value="@null" ... /> 

Probado con Spring 3.1.1

+2

¿Cuál es la configuración de Java equivalente a esto? –

+18

http://stackoverflow.com/questions/9347929/spring-set-a-property-only-if-the-value-is-not-null menciona el uso de $ {some.param: # {null}}, y eso funcionó para mí sin tener que establecer nullValue, parece que este es el valor predeterminado? (En una aplicación Spring Boot) – vorburger

+3

Poder de uso simple de SPEL $ {stuff.value: # {null}} como lo sugiere vorburger y en http://stackoverflow.com/questions/16735141/specify-default-property- value-as-null-in-spring – csf

2

Doy @nosebrain de crédito, ya que no sabía nada de "nulo valor" pero yo prefiero evitar el uso de valores nulos por completo sobre todo desde su es difícil representar null en un archivo de propiedades.

Pero aquí está una alternativa usando null sin null-value por lo que funcionará con el marcador de posición de cualquier propiedad.

public class MyObject { 

    private String value; 

    @Value("${stuff.value:@null}") 
    public void setValue(String value) { 
     if ("@null".equals(value)) this.value = null; 
     else this.value = value; 
    } 
} 

personalmente prefiero mi camino porque a lo mejor más adelante desea stuff.value para ser un valor separado por comas o tal vez para ENUM el interruptor es más fácil. También es más fácil probar la unidad :)

EDITAR: en función de sus comentarios sobre el uso de enumeraciones y mi opinión de no utilizar nulo.

@Component 
public class MyObject { 

    @Value("${crap:NOTSET}") 
    private Crap crap; 

    public enum Crap { 
     NOTSET, 
     BLAH; 
    } 
} 

Lo anterior funciona bien para mí. Usted evita nulo. Si los archivos de su propiedad quieren establecer explícitamente que no quieren manejarlo, entonces lo hace (pero ni siquiera tiene que especificar esto ya que de manera predeterminada será NOTSET).

crap=NOTSET 

null es muy malo y es diferente de NOTSET. Significa que la prueba de la primavera o de la unidad no lo configuró, razón por la cual existe una diferencia en mi humilde opinión. Todavía probablemente usaría la notación setter (ejemplo anterior) ya que es más fácil de probar unitario (las variables privadas son difíciles de establecer en una prueba unitaria).

+0

El valor String era un ejemplo, realmente lo necesitaba para un valor Enum, donde una cadena vacía solo provoca un error de conversión. Con @null puedes tener un nulo como "sin Enum set", que es lo que necesito. –

+0

Razón por la que no recomendaría null pero en cambio alguna enumeración que representa no establecida. –

+0

Eso requeriría poner Enum.NOTSET en todos los archivos de propiedades (> 30), lo que parece mucho trabajo con casi ningún beneficio ... –

61

Esto es muy antiguo, pero ahora puede usar Spring EL, p.

@Value("${stuff.value:#{null}}")

Ver this question.

4

Gracias a @vorburger:

@Value("${email.protocol:#{null}}") 
String protocol; 

fijará el valor de cadena en nula sin otras configuraciones.

Cuestiones relacionadas