Spring 引导环境后处理器覆盖命令行

Spring Boot EnvironmentPostProcessor overriding Command Line

我正在使用 EnvironmentPostProcessor, in particular the 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订单定义等)

有什么方法可以覆盖在 EnvironmentPostProcessor 中创建的 属性 值吗?

这是由于 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,即 OrderedCloudFoundryVcapEnvironmentPostProcessor 之后执行,这会创建具有最高优先级的 属性 源。