diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/ConfigDataMissingEnvironmentPostProcessor.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/ConfigDataMissingEnvironmentPostProcessor.java index 8d204d0a..a086e139 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/ConfigDataMissingEnvironmentPostProcessor.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/ConfigDataMissingEnvironmentPostProcessor.java @@ -53,6 +53,8 @@ public abstract class ConfigDataMissingEnvironmentPostProcessor implements Envir private static final Bindable CONFIG_DATA_LOCATION_ARRAY = Bindable.of(String[].class); + private static final String[] EMPTY_ARRAY = new String[0]; + /** * Order of post processor, set to run after * {@link ConfigDataEnvironmentPostProcessor}. @@ -110,15 +112,19 @@ public abstract class ConfigDataMissingEnvironmentPostProcessor implements Envir } private String[] getConfigImportArray(PropertySource propertySource) { - Binder binder = new Binder(ConfigurationPropertySource.from(propertySource)); + ConfigurationPropertySource configurationPropertySource = ConfigurationPropertySource.from(propertySource); + if (configurationPropertySource == null) { + return EMPTY_ARRAY; + } + Binder binder = new Binder(configurationPropertySource); return binder.bind(CONFIG_IMPORT_PROPERTY, CONFIG_DATA_LOCATION_ARRAY, new BindHandler() { @Override public Object onFailure(ConfigurationPropertyName name, Bindable target, BindContext context, Exception error) throws Exception { LOG.info("Error binding " + CONFIG_IMPORT_PROPERTY, error); - return new String[0]; + return EMPTY_ARRAY; } - }).orElse(new String[0]); + }).orElse(EMPTY_ARRAY); } public static class ImportException extends RuntimeException { diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/ConfigDataMissingEnvironmentPostProcessorTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/ConfigDataMissingEnvironmentPostProcessorTests.java index 42b9953d..62c1a588 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/ConfigDataMissingEnvironmentPostProcessorTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/ConfigDataMissingEnvironmentPostProcessorTests.java @@ -17,13 +17,18 @@ package org.springframework.cloud.commons; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.properties.source.ConfigurationPropertySources; +import org.springframework.boot.test.system.CapturedOutput; +import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.Environment; import org.springframework.mock.env.MockEnvironment; import org.springframework.mock.env.MockPropertySource; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; @@ -31,6 +36,7 @@ import static org.mockito.Mockito.mock; /** * @author Ryan Baxter */ +@ExtendWith(OutputCaptureExtension.class) public class ConfigDataMissingEnvironmentPostProcessorTests { @Test @@ -92,6 +98,18 @@ public class ConfigDataMissingEnvironmentPostProcessorTests { assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException(); } + @Test + void importHandlesNullConfigurationPropertySource(CapturedOutput output) { + MockEnvironment environment = new MockEnvironment(); + ConfigurationPropertySources.attach(environment); + environment.setProperty("spring.config.import[0]", "configserver:http://localhost:8888"); + environment.setProperty("spring.config.import[1]", "file:./app.properties"); + SpringApplication app = mock(SpringApplication.class); + TestConfigDataMissingEnvironmentPostProcessor processor = new TestConfigDataMissingEnvironmentPostProcessor(); + assertThatCode(() -> processor.postProcessEnvironment(environment, app)).doesNotThrowAnyException(); + assertThat(output).doesNotContain("Error binding spring.config.import"); + } + public class TestConfigDataMissingEnvironmentPostProcessor extends ConfigDataMissingEnvironmentPostProcessor { @Override