152

我在 Spring bean 中有以下内容:

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

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

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

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

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

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

谢谢

4

3 回答 3

222

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

假设“不需要”你的意思是null......

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

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

@Value("${myValue:#{null}}")
于 2016-07-08T16:05:51.370 回答
75

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

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

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

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

希望能帮助到你!

于 2018-01-08T13:23:29.320 回答
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/以一种可以理解的方式解释了它

于 2020-09-23T09:29:35.327 回答