【问题标题】:Injecting property in Springboot using @Value annotation使用@Value注解在Springboot中注入属性
【发布时间】:2020-10-22 01:27:47
【问题描述】:

我正在为应用程序使用 Spring 和 Java,并且我想使用 @Value 注释来注入属性的值,我的用例是我想首先检查该属性是否作为系统属性存在(所以它优先),否则默认为配置属性(存在于属性文件中)

在注释代码中,您可以看到我想要实现的目标,是否可以默认为其他简单字符串?如果不是,我该如何实现?

//@Value("#{configProperties['local.datasource.username']}") THIS IS THE ORIGINAL CODE
//@Value("#{systemProperties['some.key'] ?: 'my default system property value'}") THIS IS HOW SPRING PROPOSE TO SET A DEFAULT VALUE
//@Value("#{systemProperties['some.key'] ?: #{configProperties['local.datasource.username']}}") THIS IS WHAT I WANT TO ACHIEVE, HOWEVER NOT COMPILING,
private String username;

【问题讨论】:

  • SpEL 不使用 elvis 运算符,而是支持在您的第三个示例中使用 : IIRC 的默认值,第一个 # 应该是 $ 并且恕我直言,表达式不必是集体的类型:${some.key:local.datasource.username}
  • 成功了!谢谢,您是否应该将评论添加为答案以将其设置为已解决?
  • 很高兴听到,我写了一个答案并添加了一些额外的信息。

标签: java spring spring-boot spring-el


【解决方案1】:

您正在寻找的是简单的Property Palceholders

虽然Spring Expression Language 支持#{} 语法用于相当复杂的表达式(三元、调用、表达式、数学),但在大多数情况下,使用简单的属性占位符${value:defaultValue} 方法注入属性值和默认值会更好:

@Property("${some.key:local.datasource.username}")
private String username;

some.key 正在被解析的位置(与其来源无关),如果它为 null,则 Spring 默认为 local.datasource.username 的值。

请记住,即使some.key 存在,Spring 在无法解析您的默认属性时也会抛出异常。

另见:

【讨论】:

  • 为了清楚起见,${...} 不是 SpEL。它们是在引入 SpEL 之前存在多年的属性占位符。
  • 是的,这是正确的,并在我提到的问题中进行了描述。我编辑了答案以使其更清楚。
猜你喜欢
  • 2011-09-19
  • 2013-01-15
  • 2020-05-08
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多