我们有一个spring-boot
项目并正在使用application.yml
个文件。这与spring-boot
文档中描述的完全相同。 spring-boot
会自动在多个位置查找文件,并遵守我们用于这些文件位置的任何环境覆盖。
现在我们还希望将这些yaml
属性公开为Map。根据{{3}},可以使用YamlMapFactoryBean
完成此操作。但是YamlMapFactoryBean
要我通过yaml
属性指定要使用的resources
个文件。我希望它使用与创建属性时使用的相同yaml
文件和处理层次结构,这样我仍然可以利用" magical"功能,例如属性值中的占位符解析。
如果可能的话,我没有看到任何文件。
我正在考虑编写一个查看environment
的MapFactoryBean,并简单地颠倒了"展平"在创建文件的YamlProcessor
表示时由properties
执行。
还有其他想法吗?
答案 0 :(得分:1)
ConfigFileApplicationContextListener
包含在不同位置搜索文件的逻辑。 PropertySourcesLoader
将文件(Resource
)加载到属性源中。它们都不是专为独立使用而设计的,但如果您想要更多控制,则可以轻松复制它们。 PropertySourcesLoader
代表PropertySourceLoaders
集合,因此您可以添加后者中的一个代表YamlMapFactoryBean
。
稍微笨拙但可行的解决方案是使用现有机器在启动时收集YAML。向PropertySourceLoader
添加新META-INF/spring.factories
并让它创建新的属性来源,然后对Environment
进行后处理以提取源地图。
请注意:从多个YAML文件创建单个Map
,或者甚至是包含多个文档的单个文件(更不用说包含多个文档的多个文件)并不像您想象的那么容易。你有一个地图合并问题,有人将不得不定义算法。 YamlMapPropertiesBean
中的扁平化和YamlMapFactoryBean
中的合并只是(可能)更多可能性中的两种选择。