Spring应用程序中的可选环境变量

Max*_*val 13 spring environment-variables spring-boot

在我的Spring Boot应用程序中,application.properties我有这个定义:

someProp=${SOME_ENV_VARIABLE}
Run Code Online (Sandbox Code Playgroud)

但这是一个仅在某些环境中设置的可选值,我这样使用它

@Value("${someProp:#{null}}")
private String someProp;
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,当env时我得到了这个错误.var不存在
Could not resolve placeholder 'SOME_ENV_VARIABLE' in string value "${SOME_ENV_VARIABLE}"
我期待Spring只是设置一个空值,如果没有找到任何PropertySource.

如何使它可选?

小智 29

这对我来说工作:

spring.datasource.url=jdbc:mysql://${DB_IP:localhost}:3306/app
spring.datasource.username=${SPRING_DATASOURCE_USERNAME:mylocaluser}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:localpass}
Run Code Online (Sandbox Code Playgroud)


Rob*_*ley 18

提供默认值 application.properties

someProp=${SOME_ENV_VARIABLE:#{null}}
Run Code Online (Sandbox Code Playgroud)

如果使用@Value("${someProp}),这将正确评估null.首先,如果在处理SOME_ENV_VARIABLE时未找到,application.properties则其值将变为字符串文字"#{null}".然后,将其@Value计算someProp为SpEL表达式,从而得到null.可以通过查看Environmentbean 中的属性来验证实际值.

此解决方案使用PlaceholderConfigurerSupport类指定的默认值语法

可以通过properties属性为每个configurer实例全局定义默认属性值,也可以使用默认值分隔符逐个属性定义默认值,默认值为":"并可通过setValueSeparator(String)自定义.

Spring SpEL表达模板.

外部配置的 Spring Boot文档

最后,虽然您可以在@Value中编写SpEL表达式,但不会从Application属性文件处理此类表达式.

  • 空字符串可以这样声明:`someProp=${SOME_ENV_VARIABLE:}` (7认同)
  • @MauricioID:这对我不起作用,我必须使用 `someProp=${SOME_ENV_VARIABLE:default_value}` 作为字符串值。 (4认同)