【问题标题】:how to set a Property name based on another Property in Application.yaml如何根据 Application.yaml 中的另一个属性设置属性名称
【发布时间】:2019-12-22 00:44:35
【问题描述】:

我有一个动态服务名称并在 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 properties configuration cloud-foundry


    【解决方案1】:

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

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

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-23
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多