Remove deprecated merge and locations attributes from @ConfigurationProperties

Closes gh-6972
pull/6988/head
Andy Wilkinson 8 years ago
parent c108da9d53
commit bdc949d1b7

@ -87,28 +87,4 @@ public @interface ConfigurationProperties {
*/
boolean exceptionIfInvalid() default true;
/**
* Optionally provide explicit resource locations to bind to. By default the
* configuration at these specified locations will be merged with the default
* configuration. These resources take precedence over any other property sources
* defined in the environment.
* @return the path (or paths) of resources to bind to
* @see #merge()
* @deprecated as of 1.4 in favor of configuring the environment directly with
* additional locations
*/
@Deprecated
String[] locations() default {};
/**
* Flag to indicate that configuration loaded from the specified locations should be
* merged with the default configuration.
* @return the flag value (default true)
* @see #locations()
* @deprecated as of 1.4 along with {@link #locations()} in favor of configuring the
* environment directly with additional locations
*/
@Deprecated
boolean merge() default true;
}

@ -16,7 +16,6 @@
package org.springframework.boot.context.properties;
import java.io.IOException;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@ -36,13 +35,11 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.bind.PropertiesConfigurationFactory;
import org.springframework.boot.env.PropertySourcesLoader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.Ordered;
@ -58,9 +55,6 @@ import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.PropertySources;
import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
@ -77,10 +71,9 @@ import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
* @author Christian Dupuis
* @author Stephane Nicoll
*/
public class ConfigurationPropertiesBindingPostProcessor
implements BeanPostProcessor, BeanFactoryAware, ResourceLoaderAware,
EnvironmentAware, ApplicationContextAware, InitializingBean, DisposableBean,
ApplicationListener<ContextRefreshedEvent>, PriorityOrdered {
public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProcessor,
BeanFactoryAware, EnvironmentAware, ApplicationContextAware, InitializingBean,
DisposableBean, ApplicationListener<ContextRefreshedEvent>, PriorityOrdered {
/**
* The bean name of the configuration properties validator.
@ -107,8 +100,6 @@ public class ConfigurationPropertiesBindingPostProcessor
private BeanFactory beanFactory;
private ResourceLoader resourceLoader = new DefaultResourceLoader();
private Environment environment = new StandardEnvironment();
private ApplicationContext applicationContext;
@ -195,11 +186,6 @@ public class ConfigurationPropertiesBindingPostProcessor
this.beanFactory = beanFactory;
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
@ -315,19 +301,12 @@ public class ConfigurationPropertiesBindingPostProcessor
return bean;
}
@SuppressWarnings("deprecation")
private void postProcessBeforeInitialization(Object bean, String beanName,
ConfigurationProperties annotation) {
Object target = bean;
PropertiesConfigurationFactory<Object> factory = new PropertiesConfigurationFactory<Object>(
target);
if (annotation != null && annotation.locations().length != 0) {
factory.setPropertySources(
loadPropertySources(annotation.locations(), annotation.merge()));
}
else {
factory.setPropertySources(this.propertySources);
}
factory.setValidator(determineValidator(bean));
// If no explicit conversion service is provided we add one so that (at least)
// comma-separated arrays of convertibles can be bound automatically
@ -398,33 +377,6 @@ public class ConfigurationPropertiesBindingPostProcessor
return true;
}
private PropertySources loadPropertySources(String[] locations,
boolean mergeDefaultSources) {
try {
PropertySourcesLoader loader = new PropertySourcesLoader();
for (String location : locations) {
Resource resource = this.resourceLoader
.getResource(this.environment.resolvePlaceholders(location));
String[] profiles = this.environment.getActiveProfiles();
for (int i = profiles.length; i-- > 0;) {
String profile = profiles[i];
loader.load(resource, profile);
}
loader.load(resource);
}
MutablePropertySources loaded = loader.getPropertySources();
if (mergeDefaultSources) {
for (PropertySource<?> propertySource : this.propertySources) {
loaded.addLast(propertySource);
}
}
return loaded;
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
private ConversionService getDefaultConversionService() {
if (this.defaultConversionService == null) {
DefaultConversionService conversionService = new DefaultConversionService();

@ -219,29 +219,6 @@ public class ConfigurationPropertiesBindingPostProcessorTests {
.isEqualTo("foo");
}
@Test
public void placeholderResolutionWithCustomLocation() throws Exception {
this.context = new AnnotationConfigApplicationContext();
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"fooValue=bar");
this.context.register(CustomConfigurationLocation.class);
this.context.refresh();
assertThat(this.context.getBean(CustomConfigurationLocation.class).getFoo())
.isEqualTo("bar");
}
@Test
public void placeholderResolutionWithUnmergedCustomLocation() throws Exception {
this.context = new AnnotationConfigApplicationContext();
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"fooValue:bar");
this.context.register(UnmergedCustomConfigurationLocation.class);
this.context.refresh();
assertThat(
this.context.getBean(UnmergedCustomConfigurationLocation.class).getFoo())
.isEqualTo("${fooValue}");
}
@Test
public void configurationPropertiesWithFactoryBean() throws Exception {
ConfigurationPropertiesWithFactoryBean.factoryBeanInit = false;
@ -626,38 +603,6 @@ public class ConfigurationPropertiesBindingPostProcessorTests {
}
@EnableConfigurationProperties
@ConfigurationProperties(locations = "custom-location.yml")
public static class CustomConfigurationLocation {
private String foo;
public String getFoo() {
return this.foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
}
@EnableConfigurationProperties
@ConfigurationProperties(locations = "custom-location.yml", merge = false)
public static class UnmergedCustomConfigurationLocation {
private String foo;
public String getFoo() {
return this.foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
}
@Configuration
@EnableConfigurationProperties
public static class ConfigurationPropertiesWithFactoryBean {

@ -278,61 +278,6 @@ public class EnableConfigurationPropertiesTests {
assertThat(this.context.getBean(TestProperties.class).name).isEqualTo("bar");
}
@Test
public void testBindingDirectlyToFile() {
this.context.register(ResourceBindingProperties.class, TestConfiguration.class);
this.context.refresh();
assertThat(this.context.getBeanNamesForType(ResourceBindingProperties.class))
.hasSize(1);
assertThat(this.context.getBean(ResourceBindingProperties.class).name)
.isEqualTo("foo");
}
@Test
public void testBindingDirectlyToFileResolvedFromEnvironment() {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"binding.location=classpath:other.yml");
this.context.register(ResourceBindingProperties.class, TestConfiguration.class);
this.context.refresh();
assertThat(this.context.getBeanNamesForType(ResourceBindingProperties.class))
.hasSize(1);
assertThat(this.context.getBean(ResourceBindingProperties.class).name)
.isEqualTo("other");
}
@Test
public void testBindingDirectlyToFileWithDefaultsWhenProfileNotFound() {
this.context.register(ResourceBindingProperties.class, TestConfiguration.class);
this.context.getEnvironment().addActiveProfile("nonexistent");
this.context.refresh();
assertThat(this.context.getBeanNamesForType(ResourceBindingProperties.class))
.hasSize(1);
assertThat(this.context.getBean(ResourceBindingProperties.class).name)
.isEqualTo("foo");
}
@Test
public void testBindingDirectlyToFileWithExplicitSpringProfile() {
this.context.register(ResourceBindingProperties.class, TestConfiguration.class);
this.context.getEnvironment().addActiveProfile("super");
this.context.refresh();
assertThat(this.context.getBeanNamesForType(ResourceBindingProperties.class))
.hasSize(1);
assertThat(this.context.getBean(ResourceBindingProperties.class).name)
.isEqualTo("bar");
}
@Test
public void testBindingDirectlyToFileWithTwoExplicitSpringProfiles() {
this.context.register(ResourceBindingProperties.class, TestConfiguration.class);
this.context.getEnvironment().setActiveProfiles("super", "other");
this.context.refresh();
assertThat(this.context.getBeanNamesForType(ResourceBindingProperties.class))
.hasSize(1);
assertThat(this.context.getBean(ResourceBindingProperties.class).name)
.isEqualTo("spam");
}
@Test
public void testBindingWithTwoBeans() {
this.context.register(MoreConfiguration.class, TestConfiguration.class);
@ -415,14 +360,13 @@ public class EnableConfigurationPropertiesTests {
@Test
public void testBindingWithMapKeyWithPeriod() {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,
"mymap.key1.key2:value12", "mymap.key3:value3");
this.context.register(ResourceBindingPropertiesWithMap.class);
this.context.refresh();
ResourceBindingPropertiesWithMap bean = this.context
.getBean(ResourceBindingPropertiesWithMap.class);
assertThat(bean.mymap.get("key3")).isEqualTo("value3");
// this should not fail!!!
// mymap looks to contain - {key1=, key3=value3}
assertThat(bean.mymap.get("key1.key2")).isEqualTo("value12");
}
@ -772,20 +716,8 @@ public class EnableConfigurationPropertiesTests {
}
@ConfigurationProperties(locations = "${binding.location:classpath:name.yml}")
protected static class ResourceBindingProperties {
private String name;
public void setName(String name) {
this.name = name;
}
// No getter - you should be able to bind to a write-only bean
}
@EnableConfigurationProperties
@ConfigurationProperties(locations = "${binding.location:classpath:map.yml}")
@ConfigurationProperties
protected static class ResourceBindingPropertiesWithMap {
private Map<String, String> mymap;

@ -1,5 +0,0 @@
mymap:
? key1.key2
: value12
? key3
: value3

@ -1,10 +0,0 @@
---
name: foo
---
spring.profiles: super
name: bar
---
spring.profiles: other
name: spam
Loading…
Cancel
Save