我正在动态创建Spring bean(使用https://scanningpages.wordpress.com/2017/07/28/spring-dynamic-beans/中描述的方法)
@Configuration
class Conf {
@Bean
static BeanDefinitionRegistryPostProcessor beanPostProcessor(final ConfigurableEnvironment environment) {
...
}
但是无法通过POJO中的常用方式加载属性对象:
@Configuration
@ConfigurationProperties(prefix = "foo")
public class FooProperties {
并作为附加参数自动连线到beanPostProcessor
(根本不起作用)。
现在我必须像这样迭代属性:
static private FooPorperties parseProperties(ConfigurableEnvironment environment) {
for(PropertySource source : environment.getPropertySources()) {
if(source instanceof EnumerablePropertySource) {
EnumerablePropertySource propertySource = (EnumerablePropertySource) source;
for(String property : propertySource.getPropertyNames()) {
if (property.startsWith("foo")) {
System.out.println(property);
// TODO set FooProperties
}
}
}
}
我的问题是,有没有一种方法可以将这些PropertySource
映射到我的POJO,而无需手动进行迭代?
答案 0 :(得分:1)
我有一个丑陋的方式...
public static FooProperties buildProperties(ConfigurableEnvironment environment) {
FooProperties fooProperties = new FooProperties();
if (environment != null) {
MutablePropertySources propertySources = environment.getPropertySources();
new RelaxedDataBinder(fooProperties, "foo").bind(new PropertySourcesPropertyValues(propertySources));
}
return fooProperties;
}
然后,您可以在beanPostProcessor中使用buildProperties(configurableEnvironment)。
对于Spring Boot 2. +版,您必须使用refactored binding API。