【问题标题】:Spring Boot - override property contained in a map (YAML)Spring Boot - 覆盖地图中包含的属性(YAML)
【发布时间】:2020-03-30 13:59:28
【问题描述】:

我最近接受了有关如何在启动应用程序时在命令行上使用 --<property>=<value> 来正确覆盖应用程序属性(在 application.yml 中定义)的教育。到目前为止,这一直很好。

现在我有了存储在地图结构中的配置。在内部(即从 application.yml 读取时)这按预期工作,但我在命令行上覆盖的尝试失败了。

下面是application.yml中的相关配置:

services-config:
  common:
    connectionTimeout: 30000
    requestTimeout: 30000
    socketTimeout: 60000
    defaultKeepAlive: 20000
    defaultMaxConnPerRoute: 10
    maxTotalConnections: 200
  services:
    ? mission-planner
    : { id: mission-planner, name: Mission Planner, host: localhost, port: 8443 }

所以,services 是一个映射(或任何 YAML 调用它),由 ? 之后的值和映射条目值在 : 之后的值作为键。

在代码中我可以轻松访问信息,如下所示:

ServiceConnectionProperties connProps = servicesConfig.getServices().get("mission-planner");
connProps.getHost();
connProps.getPort();

我曾希望能够使用以下内容覆盖这些属性:

> java ... --services-config.services['mission-planner'].host=192.168.56.102 --services-config.services['mission-planner'].port=9400 ...

不幸的是,这似乎不起作用。控制台日志表明主机/端口被设置为 application.yml (localhost:8443) 中定义的值。

我是否使用了错误的语法来进行覆盖?是否不可能覆盖在复杂数据结构中定义的项目?如果有人可以提供帮助,将不胜感激。

【问题讨论】:

  • 可以提供json格式的[docs.spring.io/spring-boot/docs/current/reference/html/…配置):java -jar myapp.jar --spring.application.json='{"name":"test"}'
  • 您能指出任何特定的部分吗?我要寻找什么?
  • 抱歉,我在格式化评论时遇到了问题。我在link 中添加了一个锚点。这是示例:java -jar myapp.jar --spring.application.json='{"name":"test"}'。我从未将它用于复杂的结构,但您可以检查它是否适用于您的配置。
  • 你能用 YAML 代替 JSON 吗?
  • 我了解链接中信息所描述的概念,但它似乎没有涵盖像我正在使用的地图这样更复杂的结构。奇怪的是,它知道如何解析 YAML 并填充 java 对象,但是当您尝试覆盖时它似乎不起作用。我会尝试看看我是否可以让 JSON 工作。

标签: spring-boot configuration yaml


【解决方案1】:

嗯,我找到了一种让它工作的方法。我不能 100% 确定它是否是“正确的”YAML,或者可能有其他更好的方法来做到这一点。

我将 YAML 更改如下:

services-config:
  common:
    connectionTimeout: 30000
    requestTimeout: 30000
    socketTimeout: 60000
    defaultKeepAlive: 20000
    defaultMaxConnPerRoute: 10
    maxTotalConnections: 200
  services:
    mission-planner:
      id: mission-planner
      name: Mission Planner
      host: localhost
      port: 8443

我可以按如下方式覆盖“任务规划器”配置:

> java ... --services-config.services.mission-planner.host=192.168.56.102 --services-config.services.mission-planner.port=9400 ...

这行得通。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2019-04-13
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2019-03-20
    相关资源
    最近更新 更多