Cómo definir @Value como opcional

119

Tengo lo siguiente en un bean Spring:

@Value("${myValue}")
private String value;

El valor se inyecta correctamente. Sin embargo, la variable debe ser opcional, se pasa como un parámetro de línea de comando (que luego se agrega al contexto Spring usando SimpleCommandLinePropertySource ), y este argumento no siempre existirá.

He intentado lo siguiente para proporcionar un valor predeterminado:

@Value("${myValue:}")
@Value("${myValue:DEFAULT}")

pero en cada caso, el argumento predeterminado después de que se inyectan los dos puntos incluso cuando hay un valor real; esto parece anular lo que Spring debería inyectar.

¿Cuál es la forma correcta de especificar que @Value no es obligatorio?

Gracias

usuario1052610
fuente
Eso es muy extraño ... el valor predeterminado debería actuar como un valor predeterminado solo (es decir, cuando la propiedad no está definida). ¿Puede verificar su declaración "el valor predeterminado se inyecta incluso cuando hay un valor real" (por ejemplo, si no hay una clase compilada antigua)?
Pavel Horal
7
@Value("${some.prop:}")funciona para mí. Esa es la única anotación sobre esa variable.
Zarathustra
¿Puedes publicar la configuración de tu aplicación?
Vladimir Vagaytsev
@Autowired (obligatorio = falso)?
Andrew Scott Evans

Respuestas:

179

¿Cuál es la forma correcta de especificar que @Value no es obligatorio?

Trabajando en el supuesto de que por 'no requerido' te refieres a nullentonces ...

Ha notado correctamente que puede proporcionar un valor predeterminado a la derecha de un :carácter. Tu ejemplo fue @Value("${myValue:DEFAULT}").

No está limitado a cadenas simples como valores predeterminados. Puede usar expresiones SPEL , y una expresión SPEL simple para devolver nulles:

@Value("${myValue:#{null}}")
Andy Brown
fuente
49

Si está utilizando Java 8, puede aprovechar su java.util.Optionalclase. Solo tienes que declarar la variable de la siguiente manera:

@Value("${myValue:#{null}}")
private Optional<String> value;

Luego, puede verificar si el valor está definido o no de una manera más agradable:

if (value.isPresent()) {
    // do something cool
}

¡Espero eso ayude!

alonso_50
fuente
4
Según la idea de intelliJ. No es una buena práctica utilizar Optionaltipos en campos de clase.
Fırat KÜÇÜK
2
Haces esto y arroja una NPE. valuees nulo.
2018
1
@aatk Parece que el problema que describe se ha solucionado al menos desde 4.3.13. No tengo problemas para usar la declaración descrita. Aunque es mejor usar un valor que acepte nulos
Torben
2
"Según la idea de intelliJ. No es una buena práctica utilizar tipos opcionales en campos de clase". ¿Qué hay de malo en usar Opcional como variable de instancia? solo que tiene una vida relativamente larga en comparación con cuando se usa en getters ... y dicho campo debe marcarse como Transitorio para la serialización?
Andrey M. Stepanov