Adds support for non-enumerable property sources in bootstrap.
Fixes gh-724
This commit is contained in:
@@ -27,13 +27,15 @@ import org.springframework.util.StringUtils;
|
||||
import static org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.BOOTSTRAP_PROPERTY_SOURCE_NAME;
|
||||
|
||||
/**
|
||||
* Enumerable wrapper for a property source.
|
||||
*
|
||||
* @author Ryan Baxter
|
||||
*/
|
||||
public class BootstrapPropertySource<T> extends EnumerablePropertySource<T> {
|
||||
|
||||
private PropertySource<T> delegate;
|
||||
private EnumerablePropertySource<T> delegate;
|
||||
|
||||
public BootstrapPropertySource(PropertySource<T> delegate) {
|
||||
public BootstrapPropertySource(EnumerablePropertySource<T> delegate) {
|
||||
super(BOOTSTRAP_PROPERTY_SOURCE_NAME + "-" + delegate.getName(),
|
||||
delegate.getSource());
|
||||
this.delegate = delegate;
|
||||
@@ -47,13 +49,7 @@ public class BootstrapPropertySource<T> extends EnumerablePropertySource<T> {
|
||||
@Override
|
||||
public String[] getPropertyNames() {
|
||||
Set<String> names = new LinkedHashSet<>();
|
||||
if (!(this.delegate instanceof EnumerablePropertySource)) {
|
||||
throw new IllegalStateException(
|
||||
"Failed to enumerate property names due to non-enumerable property source: "
|
||||
+ this.delegate);
|
||||
}
|
||||
names.addAll(Arrays.asList(
|
||||
((EnumerablePropertySource<?>) this.delegate).getPropertyNames()));
|
||||
names.addAll(Arrays.asList(this.delegate.getPropertyNames()));
|
||||
|
||||
return StringUtils.toStringArray(names);
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ import org.springframework.core.Ordered;
|
||||
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
|
||||
import org.springframework.core.env.CompositePropertySource;
|
||||
import org.springframework.core.env.ConfigurableEnvironment;
|
||||
import org.springframework.core.env.EnumerablePropertySource;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.core.env.MutablePropertySources;
|
||||
import org.springframework.core.env.PropertySource;
|
||||
@@ -100,7 +101,13 @@ public class PropertySourceBootstrapConfiguration implements
|
||||
}
|
||||
List<PropertySource<?>> sourceList = new ArrayList<>();
|
||||
for (PropertySource<?> p : source) {
|
||||
sourceList.add(new BootstrapPropertySource<>(p));
|
||||
if (p instanceof EnumerablePropertySource) {
|
||||
EnumerablePropertySource<?> enumerable = (EnumerablePropertySource<?>) p;
|
||||
sourceList.add(new BootstrapPropertySource<>(enumerable));
|
||||
}
|
||||
else {
|
||||
sourceList.add(new SimpleBootstrapPropertySource(p));
|
||||
}
|
||||
}
|
||||
logger.info("Located property source: " + sourceList);
|
||||
composite.addAll(sourceList);
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.bootstrap.config;
|
||||
|
||||
import org.springframework.core.env.PropertySource;
|
||||
|
||||
import static org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.BOOTSTRAP_PROPERTY_SOURCE_NAME;
|
||||
|
||||
/**
|
||||
* Simple, non-enumerable PropertySource wrapper.
|
||||
* @author Ryan Baxter
|
||||
*/
|
||||
public class SimpleBootstrapPropertySource<T> extends PropertySource<T> {
|
||||
|
||||
private PropertySource<T> delegate;
|
||||
|
||||
public SimpleBootstrapPropertySource(PropertySource<T> delegate) {
|
||||
super(BOOTSTRAP_PROPERTY_SOURCE_NAME + "-" + delegate.getName(),
|
||||
delegate.getSource());
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getProperty(String name) {
|
||||
return this.delegate.getProperty(name);
|
||||
}
|
||||
|
||||
public PropertySource<T> getDelegate() {
|
||||
return delegate;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -416,12 +416,37 @@ public class BootstrapConfigurationTests {
|
||||
.isEqualTo("Hello added!");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nonEnumerablePropertySourceWorks() {
|
||||
this.context = new SpringApplicationBuilder().web(WebApplicationType.NONE)
|
||||
.sources(BareConfiguration.class)
|
||||
.properties("spring.cloud.bootstrap.name=nonenumerable").run();
|
||||
then(this.context.getEnvironment().getProperty("foo")).isEqualTo("bar");
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableConfigurationProperties
|
||||
protected static class BareConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
// This is added to bootstrap context as a source in bootstrap.properties
|
||||
protected static class SimplePropertySourceConfiguration
|
||||
implements PropertySourceLocator {
|
||||
|
||||
@Override
|
||||
public PropertySource<?> locate(Environment environment) {
|
||||
return new PropertySource("testBootstrapSimple", this) {
|
||||
@Override
|
||||
public Object getProperty(String name) {
|
||||
return ("foo".equals(name)) ? "bar" : null;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConfigurationProperties("expected")
|
||||
// This is added to bootstrap context as a source in bootstrap.properties
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
spring.main.sources:org.springframework.cloud.bootstrap.config.BootstrapConfigurationTests.PropertySourceConfiguration,org.springframework.cloud.bootstrap.config.BootstrapConfigurationTests.SimplePropertySourceConfiguration
|
||||
Reference in New Issue
Block a user