从另一个属性引用Spring应用程序.yml参考列表

16

我有一个名为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}

我收到了 Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'value' 的错误。应该如何正确引用它?


那你确切想做什么呢?你打算在defaultapplication.yml中包含stagingdev吗? - Ryuzaki L
6个回答

24

解决方案

一种方法是在您的配置文件中使用逗号分隔的列表:

  • application-dev.yml
spring.profiles: dev
config.some.value: ELEMENT1,ELEMENT2
  • 应用程序暂存配置文件
spring.profiles: staging
config.some.value: ELEMENT1,ELEMENT2,ELEMENT3

那么你应该能够在application.yml文件中访问它

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

这个解决方案不需要事先知道列表的大小。

Explanation

这个解决方案为什么有效在此处有描述: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配置属性绑定器将将该逗号分隔的字符串列表转换为List<Strings>


0

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

config.some.value: ELEMENT1, ELEMENT2, ELEMENT3

然后,在个人资料部分,您可以将配置值引用为普通字符串:

someValues: ${config.some.value}


0

0

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

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

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

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

希望它能对你有所帮助。


0
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文件中完成。 - Mateusz

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接