我正在使用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中创建的属性值?
答案 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
之后执行,从而创建具有最高优先级的属性来源。