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

r1zk6ea1  于 2023-02-16  发布在  Spring
关注(0)|答案(3)|浏览(162)

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

someProp=${SOME_ENV_VARIABLE}

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

@Value("${someProp:#{null}}")
private String someProp;

令人惊讶的是,当env.var不存在时,我会得到这个错误
Could not resolve placeholder 'SOME_ENV_VARIABLE' in string value "${SOME_ENV_VARIABLE}"
如果在任何PropertySource中都找不到Spring,我希望Spring只设置一个空值。
如何使其可选?

nhjlsmyf

nhjlsmyf1#

application.properties中提供默认值

someProp=${SOME_ENV_VARIABLE:#{null}}

当像@Value("${someProp})一样使用时,它将正确地计算为null。首先,如果在处理application.properties时未找到SOME_ENV_VARIABLE,则其值将变为字符串文字“#{null}"。然后,@ValuesomeProp计算为SpEL表达式,结果是null。实际值可以通过查看Environmentbean中的属性来验证。
此解决方案使用PlaceholderConfigurerSupport类指定的缺省值语法
可以通过properties属性为每个配置器示例全局定义默认属性值,也可以使用默认值分隔符逐个属性地定义默认属性值,默认值分隔符为“:“,可通过setValueSeparator(String)自定义。
和Spring SpEL表达式模板。
来自externalized configuration上的Sping Boot 文档
最后,虽然可以在@Value中编写SpEL表达式,但不能从Application属性文件中处理此类表达式。

abithluo

abithluo2#

我的工作是:

spring.datasource.url=jdbc:mysql://${DB_IP:localhost}:3306/app
spring.datasource.username=${SPRING_DATASOURCE_USERNAME:mylocaluser}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:localpass}
qojgxg4l

qojgxg4l3#

因为这可能会引起其他人的兴趣,所以你可以用env变量隐式地覆盖任何属性文件,假设你有property。
someapp.foo
然后可以定义一个env变量SOMEAPP_FOO(大写字母和. -〉_),spring将隐式设置env变量的属性。
进一步描述如下:https://hughesadam87.medium.com/how-to-override-spring-properties-with-env-vars-82ee1db2ae78

相关问题