我遇到了一些行为,这些行为在 Spring Boot 如何处理应用程序属性文件与配置属性类中的环境变量方面似乎不一致。我不确定这是春季的错误还是我对“应该”发生的事情的理解中的错误。
我有
@Data
@ConfigurationProperties("foo")
@Validated
public class ClientProperties {
@NotBlank
private String apiKey;
@NotBlank
private String uri;
}
在application.properties
我的文件中:
foo.baseUri=https://system.appspot.com
foo.uri=${foo.baseUri}/Valuation?apikey=${foo.apiKey}&bar={bar}
仅设置 FOO_APIKEY
如果我运行我的应用程序:
export FOO_APIKEY=DEF
然后我得到
APPLICATION FAILED TO START
***************************
Description:
Binding to target class ClientProperties(apiKey=null, uri=https://system.appspot.com/Valuation?apikey=DEF&bar={bar}) failed:
Property: foo.apiKey
Value: null
Reason: may not be empty
请注意,在 URI 中,api 密钥和基本 URI 一样被设置
仅设置 FOO_API_KEY
接下来,如果相反,我尝试仅设置此属性(删除旧的 env var):
export FOO_API_KEY=ABC
然后我的应用程序启动,但值不符合预期。我的日志显示:
API Key: ABC.
URI Property: ${foo.baseUri}/Insurance?apikey=${foo.apiKey}&bar={bar}.
请注意,现在基本 uri 也消失了,API 密钥也丢失了。
设置属性 FOO_API_KEY 和 FOO_APIKEY
当我设置两个环境变量时,应用程序启动,但 的apiKey
属性ClientProperties
保存FOO_APIKEY
导出的值,其中的uri
属性ClientProperties
保存FOO_API_KEY
导出的值。
API KEY IS: ABC.
URI IS: https://system.appspot.com/Insurance?apikey=DEF&bar={bar}.
笔记
我实际上不需要来自ClientProperties.apiKey
. 它仅通过ClientProperties.uri
已在application.properties
. 但是,我指定了属性,以便我可以进行验证以确保设置了值。我可以从我的班级中删除该值,一切都会好起来的 - 期望然后我失去我的验证。
春季启动版本为:1.5.10.RELEASE