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));