如何根据 Application.yaml 中的另一个 属性 设置 属性 名称

how to set a Property name based on another Property in Application.yaml

我有一个动态服务名称并在 application.yml 中配置它 我正在尝试使用

进行设置
my_service: ${vcap.services.${service_name}.credentials.hostname}

解析文档失败,尝试使用 2 个不同的属性

my_property: vcap.services.${service_name}.credentials.hostname
my_service: ${my_property}

在这种情况下,它可以正确地组成 属性 名称,但它将该内容用作字符串,而不是解析它。

有什么想法吗?

您可以让 属性 引用另一个 属性(即嵌套),但不能将 属性 嵌入另一个 属性。

这有效(Spring Boot 2.1 & Spring 5.1):

my.url=http://localhost:8888/service/${nestedProperty}
nestedProperty=foo/bar/baz

但正如您所发现的那样,它无法正确解析:

my_service: ${vcap.services.${service_name}.credentials.hostname}

我能够使用 属性 占位符和 SPEL 的组合来实现某些功能。

vcap:
  services:
    test-db:
      credentials:
        hostname: freedom
service_name: test-db
my_service: "#{'${vcap.services.${service_name}.credentials.hostname}'}"

显然你可以省略 vcap 部分,我这样做只是为了让测试更容易。使用 '${..}' 将导致 SPEL 查找 属性 & 它似乎能够解析嵌入的 属性.

虽然有点丑。您可能需要考虑使用配置文件有条件地连接不同的数据库依赖项,或使用 java-cfenv 获取 Cloud Foundry 提供的服务信息。

希望对您有所帮助!