作为环境变量的Spring引导属性

作为环境变量的Spring引导属性,spring,spring-boot,spring-environment,Spring,Spring Boot,Spring Environment,在spring boot如何处理应用程序属性文件和配置属性类中的环境变量方面,我遇到了一些似乎不一致的行为。我不确定这是春季的一个bug,还是我对“应该”发生什么的理解上的一个错误 我有 @Data @ConfigurationProperties("foo") @Validated public class ClientProperties { @NotBlank private String apiKey; @NotBlank private String

在spring boot如何处理应用程序属性文件和配置属性类中的环境变量方面,我遇到了一些似乎不一致的行为。我不确定这是春季的一个bug,还是我对“应该”发生什么的理解上的一个错误

我有

@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_键 接下来,如果相反,我尝试只设置此属性(删除旧的env var):

然后我的应用程序启动,但值与预期不符。我的日志显示:

API Key: ABC.
URI Property: ${foo.baseUri}/Insurance?apikey=${foo.apiKey}&bar={bar}.
请注意,现在基本uri也消失了,API键也消失了

设置属性FOO_API_KEY和FOO_APIKEY 当我设置两个环境变量时,应用程序启动,但
ClientProperties
apiKey
属性保存
FOO\u apiKey
导出的值,其中
ClientProperties
uri
属性保存
FOO\u apiKey
导出的值

API KEY IS: ABC.
URI IS: https://system.appspot.com/Insurance?apikey=DEF&bar={bar}.
笔记 实际上,我不需要
ClientProperties.apiKey
中的值。它仅通过
ClientProperties.uri
在应用程序中使用,该文件已在
application.properties
中解析。但是,我指定了该属性,以便进行验证以确保设置该值。我可以从我的类中删除该值,然后一切都会好起来——希望我失去验证

Spring boot版本为:
1.5.10。发布版

您可以查看以下链接:
API KEY IS: ABC.
URI IS: https://system.appspot.com/Insurance?apikey=DEF&bar={bar}.