framework example anotaciones java spring spring-annotations

java - example - spring boot annotations



¿Puedo establecer null como el valor predeterminado para @Value en Spring? (4)

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

<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 puede usar 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 admite el valor nulo en este momento. No puedes usar

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

Probado con Spring 3.1.1

Actualmente estoy usando la anotación @Value Spring 3.1.x de esta manera:

@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.


Esto es realmente antiguo, pero ahora puede usar Spring EL, por ejemplo

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

Ver esta pregunta


Gracias a @vorburger:

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

configurará el valor de cadena en nulo sin ninguna otra configuración.


Le doy crédito a @nosebrain ya que no sabía acerca de "valor nulo", pero prefiero evitar el uso de valores nulos en particular, ya que es difícil representar null en un archivo de propiedades.

Pero aquí hay una alternativa que usa null 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 quizás más adelante quieras stuff.value es un valor separado por comas o quizás para Enum el cambio es más fácil. También es más fácil de prueba unitaria :)

EDIT: basado en tus comentarios sobre el uso de enumeraciones y mi opinión de no usar null.

@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 forma predeterminada será NOTSET ).

crap=NOTSET

null es muy malo y es diferente a 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).