【问题标题】:spring application.yml reference list from another property来自另一个属性的 spring application.yml 参考列表
【发布时间】:2019-01-25 13:50:18
【问题描述】:

我有属性文件application-dev.yml 的内容:

spring.profiles: dev
config.some.value:
- ELEMENT1
- ELEMENT2

还有另一个application-staging.yml,内容:

spring.profiles: staging
config.some.value:
- ELEMENT1
- ELEMENT2
- ELEMENT3

所以我基本上不知道列表的大小。当我在 main application.yml 中引用此列表时,如下所示:

some.value: ${config.some.value}

我收到Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'value'。如何正确引用?

【问题讨论】:

  • 那么你到底想做什么?你想在default application.yml 中包含stagingdev

标签: spring spring-properties


【解决方案1】:

解决方案

一种方法是在您的个人资料中使用逗号分隔的列表:

  • application-dev.yml
spring.profiles: dev
config.some.value: ELEMENT1,ELEMENT2
  • application-staging.yml
spring.profiles: staging
config.some.value: ELEMENT1,ELEMENT2,ELEMENT3

那么你应该可以在 application.yml 中访问它

some.value: ${config.some.value}

此解决方案不需要预先知道列表大小。

说明

这是有效的原因描述为here。 具体来说:

YAML lists are represented as comma-separated values (useful for simple String values) and also as property keys with [index] dereferencers, for example this YAML:
servers:
    - dev.bar.com
    - foo.bar.com
Would be transformed into these properties:
servers=dev.bar.com,foo.bar.com
servers[0]=dev.bar.com
servers[1]=foo.bar.com

这尤其意味着,如果您在application.yml 中指定逗号分隔的字符串列表并将List<String> 定义为@ConfigurationProperties 中的值,spring 配置属性绑定器将把逗号分隔的字符串列表转换为@987654329 @。

【讨论】:

    【解决方案2】:

    您可以创建自己的配置类,根据需要设置该属性的值。

    请看一下这个例子:

    @ConfigurationProperties in Spring Boot

    【讨论】:

      【解决方案3】:
      MyProfile:
      SomeValues: 
          - ELEMENT1
          - ELEMENT2
           -ELEMENT3
          - ELEMENT4
      
      ---
      MyProfile:   
      someValues: 
          - ELEMENT1
          - ELEMENT2
      
      
      
      @Configuration
      @EnableConfigurationProperties
      @ConfigurationProperties
      public class YAMLConfig {
      
      
          private List<String> SomeValues= new ArrayList<>();
      
          // standard getters and setters
      
      }
      

      访问属性

        @Autowired
         private YAMLConfig myConfig;
      
      
       private List<String> SomeValues= myConfig.SomeValues();
      

      这对我有用

      【讨论】:

      • 我无法更改代码。我只需要在 .yml 文件中执行此操作。
      【解决方案4】:

      当使用字符串数组时,第一个也是唯一一个元素可以用逗号连接 - 最终结果与列表相同。这意味着您可以像这样设置变量:

      config.some.value:ELEMENT1、ELEMENT2、ELEMENT3

      然后,在您的配置文件部分,您可以引用配置值,因为它是一个普通字符串:

      someValues:${config.some.value}

      【讨论】:

        【解决方案5】:

        (我担心,)你必须这样引用它:

        application.yaml:

        some.value:
          -${config.some.value[0]}
          -${config.some.value[1]}
          -${config.some.value[2]}
        

        ...我预见到问题,当没有${config.some.value[2]} 时(列表大小不一致.. -> 解决方法:尝试“dummy”/“noop”)。

        参考:

        【讨论】:

          【解决方案6】:

          这是创建具有多个值的 .yml 文件的最佳方式:

          spring:
            profiles: dev
            config:
              some:
                values: ELEMENT1,ELEMENT2
          

          当我们使用 .yml 文件时,我们建议将每个单词分开。要读取值,请使用:

          @Value("${spring.config.some.values}")    
          private String[] values;
          

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2022-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-29
            • 1970-01-01
            • 2022-07-01
            • 1970-01-01
            • 2021-03-27
            相关资源
            最近更新 更多