Using ConfigurationProperties to fill Map in generic way

前端 未结 4 1086
礼貌的吻别
礼貌的吻别 2020-12-13 08:49

I\'m wondering, if there is a generic way to fill a map with properties you just know the prefix.

Assuming there are a bunch of properties like

names         


        
4条回答
  •  一整个雨季
    2020-12-13 09:15

    As long as you're happy having every property added into the map, rather than just those that you don't know in advance, you can do this with @ConfigurationProperties. If you want to grab everything that's beneath namespace then you need to use an empty prefix and provide a getter for a map named namespace:

    @ConfigurationProperties("")
    public class CustomProperties {
    
        private final Map namespace = new HashMap<>();
    
        public Map getNamespace() {
            return namespace;
        }
    
    }
    

    Spring Boot uses the getNamespace method to retrieve the map so that it can add the properties to it. With these properties:

    namespace.a=alpha
    namespace.b=bravo
    namespace.c=charlie
    

    The namespace map will contain three entries:

    {a=alpha, b=bravo, c=charlie}
    

    If the properties were nested more deeply, for example:

    namespace.foo.bar.a=alpha
    namespace.foo.bar.b=bravo
    namespace.foo.bar.c=charlie
    

    Then you'd use namespace.foo as the prefix and rename namespace and getNamespace on CustomProperties to bar and getBar respectively.

    Note that you should apply @EnableConfigurationProperties to your configuration to enable support for @ConfigurationProperties. You can then reference any beans that you want to be processed using that annotation, rather than providing an @Bean method for them, or using @Component to have them discovered by component scanning:

    @SpringBootApplication
    @EnableConfigurationProperties(CustomProperties.class)
    public class YourApplication {
        // …
    }
    

提交回复
热议问题