我发现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
的引用。所以,我可以阅读其他属性,但无法读取集合。
一些"解决方案"我注意到(引用因为我发现它们不太令人满意):
myCollection: foo, bar
。但这并不理想,因为格式不再是真的了。Environment.getProperty("myCollection[0]", String.class)
。将需要一些不那么优雅的实用方法来读取并将所有元素放入List中。 所以,我的问题是 - 如果我不能使用@ConfigurationProperties
,那么阅读集合类型属性的好方法是什么?同样好奇为什么逗号分隔格式有效但不是yaml风格的集合。
答案 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