From 719e06950c87af00e816206e4a523dd4e5f4b83f Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Fri, 16 Jul 2021 12:02:40 -0400 Subject: [PATCH] Use ConfigClientProperties if it exists in the BootstrapContext (#1931) * Use ConfigClientProperties if it exists in the BootstrapContext before creating a new one. Fixes #1919 * Add back test, have one test use uri from properties --- ...onfigServerConfigDataLocationResolver.java | 13 +++++-- ...ServerConfigDataLocationResolverTests.java | 35 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolver.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolver.java index 4236fe67..bcd8b0c7 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolver.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolver.java @@ -66,9 +66,16 @@ public class ConfigServerConfigDataLocationResolver protected PropertyHolder loadProperties(ConfigDataLocationResolverContext context, String uris) { Binder binder = context.getBinder(); BindHandler bindHandler = getBindHandler(context); - ConfigClientProperties configClientProperties = binder - .bind(ConfigClientProperties.PREFIX, Bindable.of(ConfigClientProperties.class), bindHandler) - .orElseGet(ConfigClientProperties::new); + + ConfigClientProperties configClientProperties; + if (context.getBootstrapContext().isRegistered(ConfigClientProperties.class)) { + configClientProperties = context.getBootstrapContext().get(ConfigClientProperties.class); + } + else { + configClientProperties = binder + .bind(ConfigClientProperties.PREFIX, Bindable.of(ConfigClientProperties.class), bindHandler) + .orElseGet(ConfigClientProperties::new); + } if (!StringUtils.hasText(configClientProperties.getName())) { // default to spring.application.name if name isn't set String applicationName = binder.bind("spring.application.name", Bindable.of(String.class), bindHandler) diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolverTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolverTests.java index ce833496..708a3ec0 100644 --- a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolverTests.java +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolverTests.java @@ -31,7 +31,10 @@ import org.springframework.boot.logging.DeferredLog; import org.springframework.mock.env.MockEnvironment; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class ConfigServerConfigDataLocationResolverTests { @@ -145,6 +148,38 @@ public class ConfigServerConfigDataLocationResolverTests { assertThat(resource.getProperties().getUri()).containsExactly(locationUri.split(",")); } + @Test + void useExistingConfigClientPropertiesInBootstrapContext() { + ConfigurableBootstrapContext bootstrapContext = mock(ConfigurableBootstrapContext.class); + when(bootstrapContext.isRegistered(eq(ConfigClientProperties.class))).thenReturn(true); + ConfigClientProperties configClientProperties = new ConfigClientProperties(); + configClientProperties.setUri(new String[] { "http://myuri" }); + when(bootstrapContext.get(eq(ConfigClientProperties.class))).thenReturn(configClientProperties); + when(context.getBootstrapContext()).thenReturn(bootstrapContext); + List resources = this.resolver.resolveProfileSpecific(context, + ConfigDataLocation.of("configserver:"), mock(Profiles.class)); + assertThat(resources).hasSize(1); + verify(bootstrapContext, times(1)).get(eq(ConfigClientProperties.class)); + ConfigServerConfigDataResource resource = resources.get(0); + assertThat(resource.getProperties().getUri()).isEqualTo(new String[] { "http://myuri" }); + } + + @Test + void createNewConfigClientPropertiesInBootstrapContext() { + ConfigurableBootstrapContext bootstrapContext = mock(ConfigurableBootstrapContext.class); + when(bootstrapContext.isRegistered(eq(ConfigClientProperties.class))).thenReturn(false); + ConfigClientProperties configClientProperties = new ConfigClientProperties(); + configClientProperties.setUri(new String[] { "http://myuri" }); + when(bootstrapContext.get(eq(ConfigClientProperties.class))).thenReturn(configClientProperties); + when(context.getBootstrapContext()).thenReturn(bootstrapContext); + List resources = this.resolver.resolveProfileSpecific(context, + ConfigDataLocation.of("configserver:http://locationuri"), mock(Profiles.class)); + assertThat(resources).hasSize(1); + verify(bootstrapContext, times(0)).get(eq(ConfigClientProperties.class)); + ConfigServerConfigDataResource resource = resources.get(0); + assertThat(resource.getProperties().getUri()).isEqualTo(new String[] { "http://locationuri" }); + } + private ConfigServerConfigDataResource testUri(String propertyUri, String locationUri) { this.environment.setProperty(ConfigClientProperties.PREFIX + ".uri", propertyUri); when(context.getBootstrapContext()).thenReturn(mock(ConfigurableBootstrapContext.class));