From c9ee1fab601bbc37913363744c4a16f4d1ee2f1a Mon Sep 17 00:00:00 2001 From: spencergibb Date: Mon, 31 Jan 2022 20:51:55 -0500 Subject: [PATCH 1/2] Return empty array if ConfigurationPropertySource.from returns null Fixes gh-1062 --- ...figDataMissingEnvironmentPostProcessor.java | 12 +++++++++--- ...taMissingEnvironmentPostProcessorTests.java | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) 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 From b041b0a55d7f92cb9f123df47b6b721306b11143 Mon Sep 17 00:00:00 2001 From: spencergibb Date: Wed, 2 Feb 2022 10:40:14 -0500 Subject: [PATCH 2/2] Adds verifier support for boot 2.7 Fixes gh-1049 --- .../CompatibilityVerifierProperties.java | 2 +- .../SpringBootVersionVerifier.java | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/CompatibilityVerifierProperties.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/CompatibilityVerifierProperties.java index b12c49c1..8177232b 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/CompatibilityVerifierProperties.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/CompatibilityVerifierProperties.java @@ -37,7 +37,7 @@ public class CompatibilityVerifierProperties { * the patch version if you don't want to specify a concrete value. Example: * {@code 3.4.x} */ - private List compatibleBootVersions = Arrays.asList("2.6.x"); + private List compatibleBootVersions = Arrays.asList("2.6.x", "2.7.x"); public boolean isEnabled() { return this.enabled; diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/SpringBootVersionVerifier.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/SpringBootVersionVerifier.java index fc2fddbd..133452d9 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/SpringBootVersionVerifier.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/SpringBootVersionVerifier.java @@ -36,6 +36,7 @@ class SpringBootVersionVerifier implements CompatibilityVerifier { final Map ACCEPTED_VERSIONS = new HashMap() { { this.put("2.6", is2_6()); + this.put("2.7", is2_7()); } }; @@ -93,6 +94,29 @@ class SpringBootVersionVerifier implements CompatibilityVerifier { }; } + CompatibilityPredicate is2_7() { + return new CompatibilityPredicate() { + + @Override + public String toString() { + return "Predicate for Boot 2.7"; + } + + @Override + public boolean isCompatible() { + try { + // since 2.7 + Class.forName("org.springframework.boot.autoconfigure.amqp.RabbitStreamTemplateConfigurer"); + return true; + } + catch (ClassNotFoundException e) { + return false; + } + + } + }; + } + private String errorDescription() { String versionFromManifest = getVersionFromManifest(); if (StringUtils.hasText(versionFromManifest)) {