【问题标题】:Spring Boot not able to read properties inside profiles expressionSpring Boot 无法读取配置文件表达式中的属性
【发布时间】:2020-12-15 21:45:01
【问题描述】:

环境细节:

  • Spring Boot 2.1.15.RELEASE
  • Spring 5.2.2.RELEASE

我有如下 application.yml 文件,

creds:
    first: default value
    
---

spring.profiles: dev

creds:
    first: dev value


---

spring.profiles: dev & mobile

creds:
    first: dev-mobile value

spring.profiles.active=dev,mobile

但是,问题是它总是加载“默认值”。

从不加载配置文件“dev & mobile”下的属性。

感谢任何帮助。

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-multi-profile-yaml

【问题讨论】:

  • 你使用的是yml格式,不是spring.profiles,是spring:profiles:
  • @DineshDontha - 也试过了,但没用。

标签: java spring spring-boot


【解决方案1】:

首先,如果您单独定义配置文件(profile:dev)并再次将其与其他配置文件结合(再次与移动设备结合,我的意思是 dev & mobile)。这不会给您任何例外,但您的组合个人资料不会被选中。

文档说,我们可以将配置文件与符号 & | 结合起来。和其他符号please refer docs,我们可以进行任何复杂的组合。但是,我不建议您单独定义配置文件并将其与其他配置文件结合起来,例如在单独定义 dev 配置文件之后将 dev & mobile 组合在一起。

以下示例显示,它是如何工作的?

application.yaml

creds:
  first: default value

---

spring:
  profiles: dev

creds:
  first: dev value

---

spring:
  profiles: mobile

creds:
  first: mobile val

---

spring:
  profiles: dev & mobile

creds:
  first: dev-mobile value

如果我们单独定义一个配置文件并将其与其他配置文件结合起来会发生什么?(就像您所做的那样)。

在这个 application.yml 文件中,我定义了 dev、mobile 和组合配置文件(dev & mobile),并且我们知道还有一个默认配置文件。

如我们所知,如果我不调用任何配置文件,它将选择默认配置文件。例如,如果我们正在读取这样的属性:

@Value("${creds.first}")
String value;

属性值:默认值

如果 --spring.profiles.active=dev ,那么它将选择 dev 配置文件。

财产价值:开发价值

如果 --spring.profiles.active=mobile ,那么它将选择 mobile 配置文件。

属性值:移动价值

如果 --spring.profiles.active=mobile,dev ,那么在这里,我们试图同时调用两个配置文件,理想情况下,我们希望应该选择组合配置文件。但它不会被选中。因为,我们已经定义了单独的配置文件(profile: devprofile: mobile 分别),首先,它会从 mobile 配置文件中读取属性和然后它从 dev 配置文件中读取属性,如果找到,然后它会使用 dev 配置文件中的属性值覆盖。如果未找到,它将仅保留 mobile 配置文件的属性值。我的意思是说,它的意思是

财产价值:开发价值

如果--spring.profiles.active=dev,mobile,那么这里,它首先从dev配置文件中读取属性值,然后,再次查找mobile 配置文件中的属性(如果找到)会覆盖该值。如果没有找到,它将只坚持 dev 配置文件的属性值。

这就是它不会读取组合配置文件(开发和移动)的原因。

如何以及何时读取组合配置文件?

根据文档,如果提到的配置文件不应该在其他地方单独定义,它可以选择一个组合配置文件:

示例:application.yaml

creds:
  first: default value

---

spring:
  profiles: showcase

creds:
  first: showcase value

---

spring:
  profiles: dev & mobile

creds:
  first: dev-mobile value

在这里,dev、mobile 使用 & 组合在一起,它们没有在其他地方单独定义。 所以,现在如果我们调用 --spring.profiles.active=dev,mobile,它将选择组合的配置文件值

资产价值:开发-移动价值

最后,如果 --spring.profiles.active=dev--spring.profiles.active=mobile,它不会选择组合配置文件。所以,默认配置文件会生病。

属性值:默认值

示例:https://github.com/donthadineshkumar/multi-profile-document.git

【讨论】:

  • 这是一个很好的解释,谢谢。但是,我觉得文档缺少这些信息。我尝试了这种方法并发现了相同的行为。向 Spring 团队提出这个问题,我看到了一些例子,人们以我提供的方式使用,但不确定是否符合他们的期望。
  • 我测试并提供了示例。我不知道你缺少什么。总之祝你好运
  • 我只是对它的工作原理有了不同的理解。
【解决方案2】:

您似乎在同一个文件中添加了每个环境 它应该是 一个文件给 dev 应用程序-dev.yml

reds:
    first: dev value

另一个用于生产的文件

应用程序生产.yml

reds:
    first: production value

继续。

【讨论】:

猜你喜欢
  • 2018-04-28
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2023-01-10
  • 1970-01-01
  • 2020-11-25
  • 2016-04-29
相关资源
最近更新 更多