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

时间:2019-08-15 15:20:41

标签: spring-boot properties configuration pivotal-cloud-foundry

我有一个动态服务名称,并在应用程序中进行配置。yml,我正在尝试使用

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

尝试使用2个不同的属性,它无法解析文档

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

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

有什么主意吗?

1 个答案:

答案 0 :(得分:0)

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

这有效(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提供的服务信息。

希望有帮助!