在我的Spring Boot应用程序中,application.properties我具有以下定义:
application.properties
someProp=${SOME_ENV_VARIABLE}
但这是一个可选值,仅在某些环境中设置,我像这样使用它
@Value("${someProp:#{null}}") private String someProp;
出人意料的是,当我遇到这个错误时,我得到了这个错误。var不存在, Could not resolve placeholder 'SOME_ENV_VARIABLE' in string value "${SOME_ENV_VARIABLE}" 我期望Spring如果找不到的话只是设置一个空值PropertySource。
Could not resolve placeholder 'SOME_ENV_VARIABLE' in string value "${SOME_ENV_VARIABLE}"
PropertySource
如何使其可选?
在中提供默认值 application.properties
someProp=${SOME_ENV_VARIABLE:#{null}}
像@Value("${someProp})这样使用时,这将正确计算为null。首先,如果在处理SOME_ENV_VARIABLE时未找到,application.properties则其值将成为字符串文字“#{null}”。然后,将其@Value评估someProp为SpEL表达式,结果为null。可以通过查看Environmentbean 中的属性来验证实际值。
@Value("${someProp})
null
SOME_ENV_VARIABLE
@Value
someProp
Environment
此解决方案利用PlaceholderConfigurerSupport该类指定的默认值语法
PlaceholderConfigurerSupport
可以通过properties属性为每个配置程序实例全局定义默认属性值,或者使用默认值分隔符(默认情况下为“:”并可以通过setValueSeparator(String)进行自定义)在逐个属性的基础上进行定义。
和Spring SpEL表达式模板。
来自Spring Boot docs关于外部化配置的信息
最后,尽管您可以在@Value中编写SpEL表达式,但不会从Application属性文件中处理此类表达式。