如何将@Value定义为可选


119

我在Spring bean中具有以下内容:

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

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

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

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

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

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

谢谢


这很奇怪……默认值应仅用作默认值(即,未定义属性时)。您是否可以再次检查“即使有实际值也注入默认值”的语句(例如,如果没有旧的编译类)?
Pavel Horal 2014年

7
@Value("${some.prop:}")确实为我工作。那是该变量的唯一注释。
Zarathustra 2014年

您可以发布您的应用程序配置吗?
弗拉基米尔·瓦加耶夫(Fladimir Vagaytsev)

@Autowired(必填= false)?
安德鲁·斯科特·埃文斯

Answers:


179

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

在假设“不需要”的前提下,null那么...

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

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

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

49

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

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

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

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

希望能帮助到你!


4
根据智能的想法。Optional在类字段中使用类型不是最佳实践。
的Firat KUCUK

2
您执行此操作,它将引发NPE。 value一片空白。
aatk

1
@aatk您所描述的问题似乎至少从4.3.13起已得到解决。使用描述的声明我没有问题。尽管最好使用可为空的值:blog.joda.org/2015/08/…–
Torben

2
“根据intelliJ的想法。在类字段中使用Optional类型不是最佳实践。” 使用Optional作为实例变量有什么问题?与在吸气剂中使用时相比,只有相对较长的寿命...并且该字段应标记为“瞬态以进行序列化”吗?
安德烈·斯蒂芬诺夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.