Spring引导yaml属性绑定:集合类型

时间:2017-12-11 08:18:02

标签: spring spring-boot

我发现Spring Boot(或一般的春天)处理yaml集合有点奇怪。根据{{​​3}}的集合应该用.yaml文件写成:

myCollection: ['foo', 'bar'] 

myCollection:
  - foo
  - bar

@Value("${myCollection}")注释或Environment.getProperty("myCollection", String[].class)(也尝试过List.class)都无法读取集合属性(返回null)。我所知道的唯一方法是使用yaml specs中描述的@ConfigurationProperties注释。

@ConfigurationProperties注释的问题在于:(a)如果我想要的只是一个属性,它太冗长了,(b)它依赖于bean注入来获取@ConfigurationProperties类的实例。在某些情况下,bean注入不可用,我们所拥有的只是对Environment的引用(例如:通过ApplicationContext)。

在我的特定情况下,我想在ApplicationEnvironmentPreparedEvent事件期间读取一些属性,因为它在构建上下文之前发生,侦听器必须手动注册,因此没有bean注入。通过event参数,我可以获得对Environment的引用。所以,我可以阅读其他属性,但无法读取集合。

一些"解决方案"我注意到(引用因为我发现它们不太令人满意):

  1. 将.yaml文件中的集合指定为myCollection: foo, bar。但这并不理想,因为格式不再是真的了。
  2. 使用索引读取单个元素,例如Environment.getProperty("myCollection[0]", String.class)。将需要一些不那么优雅的实用方法来读取并将所有元素放入List中。
  3. 所以,我的问题是 - 如果我不能使用@ConfigurationProperties,那么阅读集合类型属性的好方法是什么?同样好奇为什么逗号分隔格式有效但不是yaml风格的集合。

    编辑:更正了一些拼写错误

1 个答案:

答案 0 :(得分:2)

Quty Frankly Spring启动application.properties和application.yaml或application.yml意味着加载配置属性。

@ConfigurationProperties注释被设计为隐藏配置属性的实现并支持.properties和.yaml / .yml的抽象。

对于yaml / yml,然而Spring使用下面的org.yaml.snakeyaml.Yaml库来解析文件并将其加载到Properties内的org.springframework.boot.env.YamlPropertySourceLoader对象,并将Collection映射为{ {1}}不是数组或Set。所以你尝试做以下事情;

List