diff --git a/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/annotation/PropertySourcesBindingPostProcessor.java b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/annotation/PropertySourcesBindingPostProcessor.java index 34a3247b00a..c5046d3a0c5 100644 --- a/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/annotation/PropertySourcesBindingPostProcessor.java +++ b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/annotation/PropertySourcesBindingPostProcessor.java @@ -18,11 +18,15 @@ package org.springframework.bootstrap.context.annotation; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanCreationException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.bootstrap.bind.PropertiesConfigurationFactory; import org.springframework.bootstrap.context.annotation.EnableConfigurationPropertiesImportSelector.ConfigurationPropertiesHolder; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.env.PropertySources; import org.springframework.validation.Validator; @@ -33,7 +37,8 @@ import org.springframework.validation.Validator; * * @author Dave Syer */ -public class PropertySourcesBindingPostProcessor implements BeanPostProcessor { +public class PropertySourcesBindingPostProcessor implements BeanPostProcessor, + BeanFactoryAware { private PropertySources propertySources; @@ -43,6 +48,10 @@ public class PropertySourcesBindingPostProcessor implements BeanPostProcessor { private DefaultConversionService defaultConversionService = new DefaultConversionService(); + private BeanFactory beanFactory; + + private boolean initialized = false; + /** * @param propertySources */ @@ -64,6 +73,11 @@ public class PropertySourcesBindingPostProcessor implements BeanPostProcessor { this.conversionService = conversionService; } + @Override + public void setBeanFactory(BeanFactory beanFactory) throws BeansException { + this.beanFactory = beanFactory; + } + @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { @@ -86,7 +100,7 @@ public class PropertySourcesBindingPostProcessor implements BeanPostProcessor { factory.setValidator(this.validator); // If no explicit conversion service is provided we add one so that (at least) // comma-separated arrays of convertibles can be bound automatically - factory.setConversionService(this.conversionService == null ? this.defaultConversionService + factory.setConversionService(this.conversionService == null ? getDefaultConversionService() : this.conversionService); String targetName = null; if (annotation != null) { @@ -108,4 +122,17 @@ public class PropertySourcesBindingPostProcessor implements BeanPostProcessor { return bean; } + /** + * @return + */ + private ConversionService getDefaultConversionService() { + if (!this.initialized && this.beanFactory instanceof ListableBeanFactory) { + for (Converter converter : ((ListableBeanFactory) this.beanFactory) + .getBeansOfType(Converter.class).values()) { + this.defaultConversionService.addConverter(converter); + } + } + return this.defaultConversionService; + } + }