Spring-boot @Value属性不会被命令行参数覆盖

时间:2019-06-21 16:20:26

标签: spring-boot properties arguments command line

我有一个Maven / SpringBootApplication,它从Spring Config Server获取其属性。我需要使用命令行参数来覆盖这些属性的值。不幸的是,这些属性保留了配置服务器提供的值,并且不会被命令行参数覆盖。

  • 我已经确认参数正确传递给了App,正如我看到的那样传递给了SpringApplication.run。
  • 我可以在Spring Framework的ConfigurableApplicationContext函数中看到环境在environment.propertysources.propertySourceList.SimpleCommandLinePropertySource.source.optionArgs中带有参数的环境
  • 如果我尝试设置Spring定义的值(例如--logging.level.org.springframework.web = TRACE),它将起作用,这意味着Spring记录了跟踪信息

我阅读了有关该主题的所有可能线索,但似乎都不适用于我的问题。

这是我的Spring启动应用程序(参数正在传递给SpringApplication)

@SpringBootApplication
@ComponentScan("com.mycompany")
public class App {

  public static void main(String[] args) {
    SpringApplication.run(App.class, args);
  }
}

这里是组件和属性

@Component
public class TaskProcessor implements com.mycompnay.fwk.task.engine.TaskProcessor {

  private RestTemplate restTemplate = new RestTemplate();

  @Value("${mycompany.converter.converter-uri.office}")
  private String converterUriOffice;
}

正在传递的参数由应用程序接收(从调试器中提取):

0:"--debug=true"
1:"--logging.level.org.springframework.web=TRACE"
2:"--mycompany.converter.converter-uri.office=foo"
hash:0
value:char[44]@25

我希望属性converterUriOffice的值为foo 相反,它从配置服务器(http://localhost:3000/convert/office)中获取其值

2 个答案:

答案 0 :(得分:1)

Devilluminati的链接完成了这项工作。非常感谢!为了使内容尽可能清晰,这是我必须要做的。

1-我的应用程序有一个名为application.yml的配置服务器提供的匹配的YML文件

2-在application.yml中,我有两个配置文件,我只希望能够在使用本地配置文件时覆盖参数。 这就是我必须添加到application.yml中的内容:

print(final_res)
    ma  freq1  phd  freq2
0   a    1      a   8
1   b    2      b   9

一旦这样做(并重新启动配置服务器以确保它拉最新的YML),我就可以通过将以下内容传递给命令行来覆盖上面的值:

spring:
  profiles: local
  cloud:
    config:
      override-system-properties: false 

答案 1 :(得分:0)

在文档https://cloud.spring.io/spring-cloud-static/Edgware.SR2/single/spring-cloud.html#overriding-bootstrap-properties

中找到以下内容
  

覆盖远程属性的值   通常由引导上下文添加到您的应用程序   “远程”(例如从Config Server),默认情况下它们不能是   在本地覆盖,命令行除外。如果你想允许   您的应用程序使用其自己的属性覆盖远程属性   系统属性或配置文件,远程属性源必须   通过设置spring.cloud.config.allowOverride = true授予权限   (在本地设置此功能无效)。设置该标志后,   一些更细粒度的设置来控制遥控器的位置   与系统属性和应用程序的属性相关的属性   本地配置:spring.cloud.config.overrideNone = true覆盖   任何当地财产来源,以及   如果仅系统,spring.cloud.config.overrideSystemProperties = false   属性和环境变量应覆盖远程设置,但不能   本地配置文件。

这里与解决方案https://github.com/spring-cloud/spring-cloud-config/issues/907

相同
  

文档不是很清楚,因为它说命令行   参数始终优先于远程配置。

     

由应用程序添加到您的应用程序的属性源   引导程序上下文通常是“远程”的(例如,来自Config Server),并且   默认情况下,除非在命令上,否则无法在本地覆盖它们   线。

     

要实现此目的,您必须激活   spring.cloud.config.override-system-properties=false配置   (文档仅讨论系统属性,但似乎   也适用于命令行参数。