Reputation: 3981
We have a spring-boot
project and are using application.yml
files. This works exactly as described in the spring-boot
documentation. spring-boot
automatically looks in several locations for the files, and obeys any environment overrides we use for the location of those files.
Now we want to also expose those yaml
properties as a Map. According to the documentation this can be done with YamlMapFactoryBean
. However YamlMapFactoryBean
wants me to specify which yaml
files to use via the resources
property. I want it to use the same yaml
files and processing hierarchy that it used when creating properties, so that I can take still take advantage of "magical" features such as placeholder resolution in property values.
I didn't see any documentation on if this was possible.
I was thinking of writing a MapFactoryBean that looked at the environment
and simply reversed the "flattening" performed by the YamlProcessor
when creating the properties
representation of the file.
Any other ideas?
Upvotes: 2
Views: 3920
Reputation: 58094
The ConfigFileApplicationContextListener
contains the logic for searching for files in various locations. And PropertySourcesLoader
loads a file (Resource
) into property sources. Neither is really designed for standalone use, but you could easily duplicate them if you want more control. The PropertySourcesLoader
delegates to a collection of PropertySourceLoaders
so you could add one of the latter that delegates to your YamlMapFactoryBean
.
A slightly awkward but workable solution would be to use the existing machinery to collect the YAML on startup. Add a new PropertySourceLoader
to your META-INF/spring.factories
and let it create new property sources, then post process the Environment
to extract the source map(s).
Beware, though: creating a single Map
from multiple YAML files, or even a single one with multiple documents (let alone multiple files with multiple documents) isn't as easy as you might think. You have a map-merge problem, and someone is going to have to define the algorithm. The flattening done in YamlMapPropertiesBean
and the merge in YamlMapFactoryBean
are just two choices out of (probably) a larger set of possibilities.
Upvotes: 1