commit
9fd6a1e56a
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package org.springframework.boot;
|
package org.springframework.boot;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
@ -72,6 +73,40 @@ public class DefaultPropertiesPropertySource extends MapPropertySource {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new {@link DefaultPropertiesPropertySource} or merge with an existing one.
|
||||||
|
* @param source the {@code Map} source
|
||||||
|
* @param sources the existing sources
|
||||||
|
* @since 2.4.4
|
||||||
|
*/
|
||||||
|
public static void addOrMerge(Map<String, Object> source, MutablePropertySources sources) {
|
||||||
|
if (!CollectionUtils.isEmpty(source)) {
|
||||||
|
Map<String, Object> resultingSource = new HashMap<>();
|
||||||
|
DefaultPropertiesPropertySource propertySource = new DefaultPropertiesPropertySource(resultingSource);
|
||||||
|
if (sources.contains(NAME)) {
|
||||||
|
mergeIfPossible(source, sources, resultingSource);
|
||||||
|
sources.replace(NAME, propertySource);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
resultingSource.putAll(source);
|
||||||
|
sources.addLast(propertySource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private static void mergeIfPossible(Map<String, Object> source, MutablePropertySources sources,
|
||||||
|
Map<String, Object> resultingSource) {
|
||||||
|
PropertySource<?> existingSource = sources.get(NAME);
|
||||||
|
if (existingSource != null) {
|
||||||
|
Object underlyingSource = existingSource.getSource();
|
||||||
|
if (underlyingSource instanceof Map) {
|
||||||
|
resultingSource.putAll((Map<String, Object>) underlyingSource);
|
||||||
|
}
|
||||||
|
resultingSource.putAll(source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the 'defaultProperties' property source so that it's the last source in the
|
* Move the 'defaultProperties' property source so that it's the last source in the
|
||||||
* given {@link ConfigurableEnvironment}.
|
* given {@link ConfigurableEnvironment}.
|
||||||
|
|
|
@ -518,7 +518,9 @@ public class SpringApplication {
|
||||||
*/
|
*/
|
||||||
protected void configurePropertySources(ConfigurableEnvironment environment, String[] args) {
|
protected void configurePropertySources(ConfigurableEnvironment environment, String[] args) {
|
||||||
MutablePropertySources sources = environment.getPropertySources();
|
MutablePropertySources sources = environment.getPropertySources();
|
||||||
DefaultPropertiesPropertySource.ifNotEmpty(this.defaultProperties, sources::addLast);
|
if (!CollectionUtils.isEmpty(this.defaultProperties)) {
|
||||||
|
DefaultPropertiesPropertySource.addOrMerge(this.defaultProperties, sources);
|
||||||
|
}
|
||||||
if (this.addCommandLineProperties && args.length > 0) {
|
if (this.addCommandLineProperties && args.length > 0) {
|
||||||
String name = CommandLinePropertySource.COMMAND_LINE_PROPERTY_SOURCE_NAME;
|
String name = CommandLinePropertySource.COMMAND_LINE_PROPERTY_SOURCE_NAME;
|
||||||
if (sources.contains(name)) {
|
if (sources.contains(name)) {
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.mockito.Captor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.junit.jupiter.MockitoExtension;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
|
import org.springframework.core.env.CompositePropertySource;
|
||||||
import org.springframework.core.env.MutablePropertySources;
|
import org.springframework.core.env.MutablePropertySources;
|
||||||
import org.springframework.core.env.PropertySource;
|
import org.springframework.core.env.PropertySource;
|
||||||
import org.springframework.mock.env.MockEnvironment;
|
import org.springframework.mock.env.MockEnvironment;
|
||||||
|
@ -39,6 +40,7 @@ import static org.mockito.Mockito.verifyNoInteractions;
|
||||||
* Tests for {@link DefaultPropertiesPropertySource}.
|
* Tests for {@link DefaultPropertiesPropertySource}.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
* @author Madhura Bhave
|
||||||
*/
|
*/
|
||||||
@ExtendWith(MockitoExtension.class)
|
@ExtendWith(MockitoExtension.class)
|
||||||
class DefaultPropertiesPropertySourceTests {
|
class DefaultPropertiesPropertySourceTests {
|
||||||
|
@ -104,6 +106,39 @@ class DefaultPropertiesPropertySourceTests {
|
||||||
DefaultPropertiesPropertySource.moveToEnd(environment);
|
DefaultPropertiesPropertySource.moveToEnd(environment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addOrMergeWhenExistingNotFoundShouldAdd() {
|
||||||
|
MockEnvironment environment = new MockEnvironment();
|
||||||
|
MutablePropertySources propertySources = environment.getPropertySources();
|
||||||
|
DefaultPropertiesPropertySource.addOrMerge(Collections.singletonMap("spring", "boot"), propertySources);
|
||||||
|
assertThat(propertySources.contains(DefaultPropertiesPropertySource.NAME)).isTrue();
|
||||||
|
assertThat(propertySources.get(DefaultPropertiesPropertySource.NAME).getProperty("spring")).isEqualTo("boot");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addOrMergeWhenExistingFoundShouldMerge() {
|
||||||
|
MockEnvironment environment = new MockEnvironment();
|
||||||
|
MutablePropertySources propertySources = environment.getPropertySources();
|
||||||
|
propertySources.addLast(new DefaultPropertiesPropertySource(Collections.singletonMap("spring", "boot")));
|
||||||
|
DefaultPropertiesPropertySource.addOrMerge(Collections.singletonMap("hello", "world"), propertySources);
|
||||||
|
assertThat(propertySources.contains(DefaultPropertiesPropertySource.NAME)).isTrue();
|
||||||
|
assertThat(propertySources.get(DefaultPropertiesPropertySource.NAME).getProperty("spring")).isEqualTo("boot");
|
||||||
|
assertThat(propertySources.get(DefaultPropertiesPropertySource.NAME).getProperty("hello")).isEqualTo("world");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addOrMergeWhenExistingNotMapPropertySourceShouldNotMerge() {
|
||||||
|
MockEnvironment environment = new MockEnvironment();
|
||||||
|
MutablePropertySources propertySources = environment.getPropertySources();
|
||||||
|
CompositePropertySource composite = new CompositePropertySource(DefaultPropertiesPropertySource.NAME);
|
||||||
|
composite.addPropertySource(new DefaultPropertiesPropertySource(Collections.singletonMap("spring", "boot")));
|
||||||
|
propertySources.addFirst(composite);
|
||||||
|
DefaultPropertiesPropertySource.addOrMerge(Collections.singletonMap("hello", "world"), propertySources);
|
||||||
|
assertThat(propertySources.contains(DefaultPropertiesPropertySource.NAME)).isTrue();
|
||||||
|
assertThat(propertySources.get(DefaultPropertiesPropertySource.NAME).getProperty("spring")).isNull();
|
||||||
|
assertThat(propertySources.get(DefaultPropertiesPropertySource.NAME).getProperty("hello")).isEqualTo("world");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void moveToEndWhenPresentMovesToEnd() {
|
void moveToEndWhenPresentMovesToEnd() {
|
||||||
MockEnvironment environment = new MockEnvironment();
|
MockEnvironment environment = new MockEnvironment();
|
||||||
|
|
|
@ -53,6 +53,7 @@ import org.springframework.boot.availability.AvailabilityChangeEvent;
|
||||||
import org.springframework.boot.availability.AvailabilityState;
|
import org.springframework.boot.availability.AvailabilityState;
|
||||||
import org.springframework.boot.availability.LivenessState;
|
import org.springframework.boot.availability.LivenessState;
|
||||||
import org.springframework.boot.availability.ReadinessState;
|
import org.springframework.boot.availability.ReadinessState;
|
||||||
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
import org.springframework.boot.context.event.ApplicationContextInitializedEvent;
|
import org.springframework.boot.context.event.ApplicationContextInitializedEvent;
|
||||||
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
|
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
|
||||||
import org.springframework.boot.context.event.ApplicationFailedEvent;
|
import org.springframework.boot.context.event.ApplicationFailedEvent;
|
||||||
|
@ -105,6 +106,7 @@ import org.springframework.core.io.ResourceLoader;
|
||||||
import org.springframework.core.metrics.ApplicationStartup;
|
import org.springframework.core.metrics.ApplicationStartup;
|
||||||
import org.springframework.core.metrics.StartupStep;
|
import org.springframework.core.metrics.StartupStep;
|
||||||
import org.springframework.http.server.reactive.HttpHandler;
|
import org.springframework.http.server.reactive.HttpHandler;
|
||||||
|
import org.springframework.mock.env.MockEnvironment;
|
||||||
import org.springframework.test.context.support.TestPropertySourceUtils;
|
import org.springframework.test.context.support.TestPropertySourceUtils;
|
||||||
import org.springframework.util.LinkedMultiValueMap;
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
import org.springframework.util.MultiValueMap;
|
import org.springframework.util.MultiValueMap;
|
||||||
|
@ -887,6 +889,18 @@ class SpringApplicationTests {
|
||||||
assertThat(getEnvironment().getProperty("baz")).isEqualTo("");
|
assertThat(getEnvironment().getProperty("baz")).isEqualTo("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void defaultPropertiesShouldBeMerged() {
|
||||||
|
MockEnvironment environment = new MockEnvironment();
|
||||||
|
environment.getPropertySources().addFirst(
|
||||||
|
new MapPropertySource(DefaultPropertiesPropertySource.NAME, Collections.singletonMap("bar", "foo")));
|
||||||
|
SpringApplication application = new SpringApplicationBuilder(ExampleConfig.class).environment(environment)
|
||||||
|
.properties("baz=bing").web(WebApplicationType.NONE).build();
|
||||||
|
this.context = application.run();
|
||||||
|
assertThat(getEnvironment().getProperty("bar")).isEqualTo("foo");
|
||||||
|
assertThat(getEnvironment().getProperty("baz")).isEqualTo("bing");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void commandLineArgsApplyToSpringApplication() {
|
void commandLineArgsApplyToSpringApplication() {
|
||||||
TestSpringApplication application = new TestSpringApplication(ExampleConfig.class);
|
TestSpringApplication application = new TestSpringApplication(ExampleConfig.class);
|
||||||
|
|
Loading…
Reference in New Issue