Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring boot@Value属性未被命令行参数覆盖_Spring Boot_Properties_Arguments_Command_Line - Fatal编程技术网

Spring boot Spring boot@Value属性未被命令行参数覆盖

Spring boot Spring boot@Value属性未被命令行参数覆盖,spring-boot,properties,arguments,command,line,Spring Boot,Properties,Arguments,Command,Line,我有一个Maven/springboot应用程序,它从Spring配置服务器获取属性。我需要使用命令行参数覆盖这些属性的值。不幸的是,这些属性保留了配置服务器提供的值,并且没有被命令行参数覆盖 我已经确认参数已正确地传递到应用程序,正如我看到的那样,参数已传递到SpringApplication.run 我可以在Spring框架的函数ConfigurableApplicationContext中看到环境中包含environment.propertysources.propertySourceL

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

  • 我已经确认参数已正确地传递到应用程序,正如我看到的那样,参数已传递到SpringApplication.run
  • 我可以在Spring框架的函数ConfigurableApplicationContext中看到环境中包含environment.propertysources.propertySourceList.SimpleCommand LinePropertySource.source.optionArgs中的参数
  • 如果我尝试设置一个Spring定义的值(例如--logging.level.org.springframework.web=TRACE),它会工作,这意味着Spring会记录跟踪
我读了关于这个问题的所有可能的线索,但似乎没有一条适用于我的问题

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

这是组件和属性

@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;
}
正在传递的参数由应用程序接收(从调试器中提取):

我希望属性转换器rioffice的值为foo
相反,它从配置服务器()获取其值。

可在以下文档中找到

重写远程属性的值,该属性源 通过引导上下文添加到应用程序中的 “远程”(例如,从配置服务器),默认情况下,它们不能 本地重写,命令行上除外。如果你想允许 您的应用程序将使用自己的属性覆盖远程属性 系统属性或配置文件,远程属性源必须 通过设置spring.cloud.config.allowOverride=true来授予它权限 (在本地设置此选项不起作用)。一旦设置了该标志,就有 一些更细粒度的设置来控制远程服务器的位置 与系统属性和应用程序的 本地配置:spring.cloud.config.overrideOne=true以覆盖 任何本地财产来源,以及 spring.cloud.config.overrideSystemProperties=false,如果只有系统 属性和环境变量应覆盖远程设置,但不能覆盖 本地配置文件

解决方案也有同样的问题

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

由应用程序添加到您的属性源 引导上下文通常是“远程的”(例如,从配置服务器),并且 默认情况下,它们不能在本地重写,除非在命令上 线路

要实现这一点,您必须激活
spring.cloud.config.override系统属性=false
configuration (文档仅讨论系统属性,但似乎 也适用于命令行参数)


来自Devilluminati的链接完成了这项工作。谢谢!为了尽可能清楚地说明这一点,以下是我必须做的

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

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

spring:
  profiles: local
  cloud:
    config:
      override-system-properties: false 
一旦我这样做了(并重新启动配置服务器以确保它获取最新的YML),我就可以通过将以下内容传递到命令行来覆盖上面的值:

--mycompany.converter.converter-uri.office=foo

如果您使用命令行运行,您的脚本将看起来像
java-jar--mycompany.converter.converter uri.office=value
Thank you DeviceLuminati。它成功了。下面是yml配置文件的一个摘录,供下一批可能与之斗争的人参考。注意,我使用了一个本地概要文件:spring:profiles:localcloud:config:override-system-properties:false
spring:
  profiles: local
  cloud:
    config:
      override-system-properties: false 
--mycompany.converter.converter-uri.office=foo