如何将@Value定义为可选

时间:2014-04-28 18:00:08

标签: spring spring-bean

我在Spring bean中有以下内容:

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

正确注入值。但是,变量必须是可选的,它作为命令行参数传递(然后使用 SimpleCommandLinePropertySource 将其添加到Spring上下文中),并且此参数不会始终存在。

为了提供默认值,我尝试了以下两种方法:

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

但是在每种情况下,即使存在实际值,也会在冒号后注入默认参数 - 这会覆盖Spring应该注入的内容。

指定不需要 @Value 的正确方法是什么?

由于

3 个答案:

答案 0 :(得分:131)

  

指定不需要@Value的正确方法是什么?

假设“不需要”是指null然后......

您已正确注意到您可以在:字符的右侧提供默认值。您的示例是@Value("${myValue:DEFAULT}")

您不限于普通字符串作为默认值。您可以使用SPEL表达式,返回null的简单SPEL表达式为:

@Value("${myValue:#{null}}")

答案 1 :(得分:30)

如果您使用的是Java 8,则可以利用其java.util.Optional类。 您只需按照以下方式声明变量:

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

然后,您可以以更好的方式检查值是否已定义:

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

希望它有所帮助!

答案 2 :(得分:1)

我猜您正在使用多个上下文:属性占位符/声明?

如果是这样,这是自2012年以来的一个已知问题,但尚未解决,这显然是由于缺乏兴趣并且没有干净的解决方法。请参见https://github.com/spring-projects/spring-framework/issues/14623,以获取讨论和解决方法。 http://www.michelschudel.nl/wp/2017/01/25/beware-of-multiple-spring-propertyplaceholderconfigurers-and-default-values/

以一种可以理解的方式对其进行了解释。