如何将@Value 定义为可选项

我在一个春天的豆子里有下面的东西:

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

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

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

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

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

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

谢谢

76089 次浏览

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

假设你说的“不需要”是指 null,那么..。

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

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

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

如果您正在使用 Java8,则可以利用它的 java.util.Optional类。 你只需要像下面这样声明变量:

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

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

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

希望能有帮助!

我想您是在使用多个上下文: property-placeholder/声明?

如果是这样的话,这是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/以一种可以理解的方式解释了这一点

如果您想让配置属性成为可选的,只需要像下面这样传递一个空字符串:

@Value("${app.optional.value:}")