【问题标题】:Is where a way to define a variable in the Spring Boot application.yml for a list with a default value是一种在 Spring Boot application.yml 中为具有默认值的列表定义变量的方法
【发布时间】:2021-03-30 18:31:49
【问题描述】:

我正在尝试在我的 Spring Boot 应用程序中创建一个可以被环境变量覆盖的属性。这样做的典型方式是这样的:

some:
  property: ${some_property:default_value}

然后我们使用 docker compose 将环境变量注入到该属性中。我遇到的问题是指列表。我想做同样的概念,但在 yml 中使用列表格式。列表的正常格式是这样的:

some:
  property:
    - value1
    - value2
    - value3

我想让它成为一个环境变量,上面有默认值。所以像这样(但......正确):

some:
  property: ${some_list:[
    - defaultValue1
    - defaultValue2
    - defaultValue3
  ]}

技术上可行的方法是,如果我将该属性设为逗号分隔字符串,然后在代码中对其进行解析,但是当您有很多非常长的值时,使用单个字符串包含所有这些值可能会很难看。那么有没有办法让列表 Spring 属性成为 application.yml 中具有默认值的变量(所以不是 java 代码中的注释)

【问题讨论】:

  • 为什么不把默认值放在application.yml 中,然后用一个环境变量覆盖它们,而不管application.yml 吗?
  • 只有将它添加到启动命令中才有效吗?就像 -Dsome.list=comma,delimited,value 一样?我们有一个 .env 文件,它导出了一堆环境变量,而 Spring Boot 应用程序使用了这些变量(不过我相信 docker compose 会处理它们之间的关系)
  • "只有将它添加到启动命令中才有效?" - 不。它不必添加到启动命令或其他任何内容中。 “就像 -Dsome.list=comma,delimited,value 一样?” - 这不是环境变量。这是一个 JVM 系统属性,它也可以工作。
  • 明白了。原来我不知道弹簧属性的格式是相关的,即破折号而不是驼峰式和所有大写环境变量

标签: java spring spring-boot yaml


【解决方案1】:

只需将默认值放在 application.properties 中即可:

some:
  property:
    - value1
    - value2
    - value3

用环境变量覆盖:

SOME_PROPERTY[0]=anotherValue1
SOME_PROPERTY[1]=anotherValue2
SOME_PROPERTY[2]=anotherValue3

【讨论】:

  • 太棒了!没有意识到你可以像那样覆盖而不是使用替换
猜你喜欢
  • 2016-03-06
  • 2020-03-24
  • 2021-07-20
  • 1970-01-01
  • 2022-11-22
  • 2019-05-23
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
相关资源
最近更新 更多