我在Spring bean中有以下内容:
@Value("${myValue}")
private String value;
正确注入值。但是,变量必须是可选的,它作为命令行参数传递(然后使用 SimpleCommandLinePropertySource 将其添加到Spring上下文中),并且此参数不会始终存在。
为了提供默认值,我尝试了以下两种方法:
@Value("${myValue:}")
@Value("${myValue:DEFAULT}")
但是在每种情况下,即使存在实际值,也会在冒号后注入默认参数 - 这会覆盖Spring应该注入的内容。
指定不需要 @Value 的正确方法是什么?
由于
答案 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/
以一种可以理解的方式对其进行了解释。