Yaml属性作为Spring Boot中的Map

时间:2014-04-10 20:28:23

标签: spring spring-boot

我们有一个spring-boot项目并正在使用application.yml个文件。这与spring-boot文档中描述的完全相同。 spring-boot会自动在多个位置查找文件,并遵守我们用于这些文件位置的任何环境覆盖。

现在我们还希望将这些yaml属性公开为Map。根据{{​​3}},可以使用YamlMapFactoryBean完成此操作。但是YamlMapFactoryBean要我通过yaml属性指定要使用的resources个文件。我希望它使用与创建属性时使用的相同yaml文件和处理层次结构,这样我仍然可以利用" magical"功能,例如属性值中的占位符解析。

如果可能的话,我没有看到任何文件。 我正在考虑编写一个查看environment的MapFactoryBean,并简单地颠倒了"展平"在创建文件的YamlProcessor表示时由properties执行。

还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

ConfigFileApplicationContextListener包含在不同位置搜索文件的逻辑。 PropertySourcesLoader将文件(Resource)加载到属性源中。它们都不是专为独立使用而设计的,但如果您想要更多控制,则可以轻松复制它们。 PropertySourcesLoader代表PropertySourceLoaders集合,因此您可以添加后者中的一个代表YamlMapFactoryBean

稍微笨拙但可行的解决方案是使用现有机器在启动时收集YAML。向PropertySourceLoader添加新META-INF/spring.factories并让它创建新的属性来源,然后对Environment进行后处理以提取源地图。

请注意:从多个YAML文件创建单个Map,或者甚至是包含多个文档的单个文件(更不用说包含多个文档的多个文件)并不像您想象的那么容易。你有一个地图合并问题,有人将不得不定义算法。 YamlMapPropertiesBean中的扁平化和YamlMapFactoryBean中的合并只是(可能)更多可能性中的两种选择。