Spring boot yaml属性绑定:集合类型
我发现SpringBoot(或一般的Spring)对yaml集合的处理有点奇怪。根据的集合应写入.yaml文件,如下所示:Spring boot yaml属性绑定:集合类型,spring,spring-boot,Spring,Spring Boot,我发现SpringBoot(或一般的Spring)对yaml集合的处理有点奇怪。根据的集合应写入.yaml文件,如下所示: myCollection: ['foo', 'bar'] 或 但是@Value(${myCollection}”)注释或环境.getProperty(“myCollection”,String[].class)(也尝试了列表.class)都不能读取集合属性(返回null)。我所知道的唯一有效的方法是使用中描述的@ConfigurationProperties注释 @Co
myCollection: ['foo', 'bar']
或
但是@Value(${myCollection}”)
注释或环境.getProperty(“myCollection”,String[].class)
(也尝试了列表.class
)都不能读取集合属性(返回null)。我所知道的唯一有效的方法是使用中描述的@ConfigurationProperties
注释
@ConfigurationProperties
注释的问题在于:(a)如果我只需要一个属性,那么它就太冗长了;(b)它依赖bean注入来获取@ConfigurationProperties
类的实例。在某些情况下,bean注入是不可用的,我们所拥有的只是对环境的引用(例如:thruapplicationcontext)
在我的特殊情况下,我想在ApplicationEnvironmentPreparedEvent
事件期间读取一些属性,因为它发生在构建上下文之前,监听器必须手动注册,因此没有bean注入。通过事件参数,我可以获得对环境的引用。因此,我可以读取其他属性,但无法读取集合
我提到了几个“解决方案”(引用是因为我觉得它们不太令人满意):
将.yaml文件中的集合指定为myCollection:foo,bar
。但这并不理想,因为格式不再是真正的yaml
使用索引读取单个元素,例如Environment.getProperty(“myCollection[0]”,String.class)
。将需要一些不那么优雅的实用方法来读取所有元素并将其放入列表中李>
所以,我的问题是-如果我不能使用@ConfigurationProperties
,那么什么是读取集合类型属性的好方法?同样令人好奇的是,为什么逗号分隔格式有效,而yaml样式的集合无效
编辑:坦率地说,Spring boot application.properties和application.yaml或application.yml用于加载配置属性,更正了一些输入错误
@ConfigurationProperties
注释被设计为一种抽象,用于隐藏配置属性的实现,并支持.properties和.yaml/.yml
但是,对于yaml/yml,Spring使用下面的org.yaml.snakeyaml.yaml
库解析文件并将其加载到org.springframework.boot.env.YamlPropertySourceLoader中的属性
对象中,集合
映射为集
而不是数组或列表
。所以你试着做下面的事情
Environment.getProperty("myCollection", Set.class)
对于不仅仅是简单原语值(数字、字符串等)的属性,@ConfigurationProperties
可能是最干净的解决方案,无论您是否希望使用它,因为它的冗长性。这也在中介绍。逗号分隔列表之所以有效,是因为您将其作为字符串读取,并使用SpEL通过拆分将其转换为列表。
Environment.getProperty("myCollection", Set.class)