Spring Boot EnvironmentPostProcessor覆盖命令行

时间:2016-03-18 12:53:25

标签: spring spring-mvc spring-boot cloudfoundry

我正在使用EnvironmentPostProcessor,特别是CloudFoundryVcapEnvironmentPostProcessor,以便解析一些环境变量并使它们可以作为Spring属性访问。

当我运行我的应用程序时,EnvironmentPostProcessor启动并按预期创建所需的属性变量。

@Value("${vcap.services.test-service.name}") /* Example of a property loaded from PostProcessor. Works fine. */

但是,当我尝试使用命令行或属性文件显式设置此属性值时,我指定的值不会覆盖EnvironmentPostProcessor正在填充的值。我希望通过命令行覆盖此属性应该优先。

vcap.services.test-service.name=TEST_VALUE不会覆盖。

基本上,为了覆盖此EnvironmentPostProcessor(命令行,配置文件,.properties文件,spring.factories订单定义等)设置的值,我似乎可以执行 nothing p>

有没有办法覆盖在EnvironmentPostProcessor中创建的属性值?

1 个答案:

答案 0 :(得分:2)

这是由CloudFoundryVcapEnvironmentPostProcessor添加属性来源引起的,该属性来源的优先级高于您用来覆盖属性的方法:https://github.com/spring-projects/spring-boot/blob/v1.3.3.RELEASE/spring-boot/src/main/java/org/springframework/boot/cloud/CloudFoundryVcapEnvironmentPostProcessor.java#L126-L135

如果您使用命令行参数或-D系统属性,那么该块设置低于命令行参数吗?

您可以尝试添加spring-boot-starter-actuator并点击/ env端点以查看所有属性源及其优先级,首先出现的属性源优先级高于JSON中出现的优先级。作为最后的手段,您可以创建自己的EnvironmentPostProcessor Ordered以在CloudFoundryVcapEnvironmentPostProcessor之后执行,从而创建具有最高优先级的属性来源。