diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/refresh/ConfigDataContextRefresher.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/refresh/ConfigDataContextRefresher.java index b90cba3c..a8644c83 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/refresh/ConfigDataContextRefresher.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/refresh/ConfigDataContextRefresher.java @@ -16,25 +16,38 @@ package org.springframework.cloud.context.refresh; +import java.util.List; +import java.util.function.Supplier; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.boot.BootstrapContext; +import org.springframework.boot.BootstrapRegistry; import org.springframework.boot.ConfigurableBootstrapContext; import org.springframework.boot.DefaultBootstrapContext; -import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.event.ApplicationPreparedEvent; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.boot.logging.DeferredLogFactory; +import org.springframework.boot.util.Instantiator; import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration; -import org.springframework.cloud.bootstrap.encrypt.DecryptEnvironmentPostProcessor; import org.springframework.cloud.context.scope.refresh.RefreshScope; +import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource; import org.springframework.core.env.StandardEnvironment; -import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.support.SpringFactoriesLoader; /** * @author Dave Syer * @author Venil Noronha */ -public class ConfigDataContextRefresher extends ContextRefresher { +public class ConfigDataContextRefresher extends ContextRefresher + implements ApplicationListener { - private final DecryptEnvironmentPostProcessor decryptEnvironmentPostProcessor = new DecryptEnvironmentPostProcessor(); + private SpringApplication application; @Deprecated public ConfigDataContextRefresher(ConfigurableApplicationContext context, RefreshScope scope) { @@ -46,17 +59,38 @@ public class ConfigDataContextRefresher extends ContextRefresher { super(context, scope, properties); } + @Override + public void onApplicationEvent(ApplicationPreparedEvent event) { + application = event.getSpringApplication(); + } + @Override protected void updateEnvironment() { if (logger.isTraceEnabled()) { logger.trace("Re-processing environment to add config data"); } StandardEnvironment environment = copyEnvironment(getContext().getEnvironment()); - String[] activeProfiles = getContext().getEnvironment().getActiveProfiles(); - DefaultResourceLoader resourceLoader = new DefaultResourceLoader(); ConfigurableBootstrapContext bootstrapContext = getContext().getBeanProvider(ConfigurableBootstrapContext.class) .getIfAvailable(DefaultBootstrapContext::new); - ConfigDataEnvironmentPostProcessor.applyTo(environment, resourceLoader, bootstrapContext, activeProfiles); + + // run thru all EnvironmentPostProcessor instances. This lets things like vcap and + // decrypt happen after refresh. The hard coded call to + // ConfigDataEnvironmentPostProcessor.applyTo() is now automated as well. + DeferredLogFactory logFactory = new PassthruDeferredLogFactory(); + List classNames = SpringFactoriesLoader.loadFactoryNames(EnvironmentPostProcessor.class, + getClass().getClassLoader()); + Instantiator instantiator = new Instantiator<>(EnvironmentPostProcessor.class, + (parameters) -> { + parameters.add(DeferredLogFactory.class, logFactory); + parameters.add(Log.class, logFactory::getLog); + parameters.add(ConfigurableBootstrapContext.class, bootstrapContext); + parameters.add(BootstrapContext.class, bootstrapContext); + parameters.add(BootstrapRegistry.class, bootstrapContext); + }); + List postProcessors = instantiator.instantiate(classNames); + for (EnvironmentPostProcessor postProcessor : postProcessors) { + postProcessor.postProcessEnvironment(environment, application); + } if (environment.getPropertySources().contains(REFRESH_ARGS_PROPERTY_SOURCE)) { environment.getPropertySources().remove(REFRESH_ARGS_PROPERTY_SOURCE); @@ -86,9 +120,25 @@ public class ConfigDataContextRefresher extends ContextRefresher { } } } + } + + static class PassthruDeferredLogFactory implements DeferredLogFactory { + + @Override + public Log getLog(Supplier destination) { + return destination.get(); + } + + @Override + public Log getLog(Class destination) { + return getLog(() -> LogFactory.getLog(destination)); + } + + @Override + public Log getLog(Log destination) { + return getLog(() -> destination); + } - // TODO: invert control - decryptEnvironmentPostProcessor.postProcessEnvironment(getContext().getEnvironment(), null); } } diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionIntegrationTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionIntegrationTests.java index 01d28857..08ba3ae0 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionIntegrationTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionIntegrationTests.java @@ -23,8 +23,9 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.cloud.context.refresh.ContextRefresher; +import org.springframework.cloud.context.test.TestConfigDataLocationResolver; +import org.springframework.cloud.context.test.TestEnvPostProcessor; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.ConfigurableEnvironment; @@ -124,20 +125,21 @@ public class EncryptionIntegrationTests { @Test public void decryptAfterRefresh() { + TestConfigDataLocationResolver.config.put("foo.password", + "{cipher}bf29452295df354e6153c5b31b03ef23c70e55fba24299aa85c63438f1c43c95"); ConfigurableApplicationContext context = new SpringApplicationBuilder(TestAutoConfiguration.class) - .web(WebApplicationType.NONE) - .properties("encrypt.key:pie", - "foo.password:{cipher}bf29452295df354e6153c5b31b03ef23c70e55fba24299aa85c63438f1c43c95", + .web(WebApplicationType.NONE).properties("encrypt.key:pie", TestEnvPostProcessor.EPP_ENABLED + "=true", "spring.cloud.refresh.enabled:true") .run(); TextEncryptor encryptor = context.getBean(TextEncryptor.class); ContextRefresher refresher = context.getBean(ContextRefresher.class); ConfigurableEnvironment env = context.getBean(ConfigurableEnvironment.class); then(env.getProperty("foo.password")).isEqualTo("test"); - TestPropertyValues.of("foo.password={cipher}" + encryptor.encrypt("newValue")).applyTo(env); + TestConfigDataLocationResolver.config.put("foo.password", "{cipher}" + encryptor.encrypt("newValue")); refresher.refresh(); then(env.getProperty("foo.password")).isEqualTo("newValue"); context.close(); + TestConfigDataLocationResolver.config.clear(); } @Configuration(proxyBeanMethods = false) diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ConfigDataContextRefresherIntegrationTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ConfigDataContextRefresherIntegrationTests.java index 99d85b85..75582bf2 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ConfigDataContextRefresherIntegrationTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ConfigDataContextRefresherIntegrationTests.java @@ -16,49 +16,26 @@ package org.springframework.cloud.context.refresh; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicInteger; - import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.boot.BootstrapRegistry.InstanceSupplier; import org.springframework.boot.ConfigurableBootstrapContext; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.context.config.ConfigData; -import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor; -import org.springframework.boot.context.config.ConfigDataLoader; -import org.springframework.boot.context.config.ConfigDataLoaderContext; -import org.springframework.boot.context.config.ConfigDataLocation; -import org.springframework.boot.context.config.ConfigDataLocationNotFoundException; -import org.springframework.boot.context.config.ConfigDataLocationResolver; -import org.springframework.boot.context.config.ConfigDataLocationResolverContext; -import org.springframework.boot.context.config.ConfigDataResource; -import org.springframework.boot.context.config.ConfigDataResourceNotFoundException; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.cloud.context.test.TestConfigDataLocationResolver; +import org.springframework.cloud.context.test.TestEnvPostProcessor; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; -import org.springframework.core.Ordered; import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.MapPropertySource; import static org.assertj.core.api.BDDAssertions.then; public class ConfigDataContextRefresherIntegrationTests { - private static final String EPP_VALUE = "configdatarefresh.epp.count"; - - private static final String EPP_ENABLED = "configdatarefresh.epp.enabled"; - private TestProperties properties; private ConfigurableEnvironment environment; @@ -69,8 +46,12 @@ public class ConfigDataContextRefresherIntegrationTests { @BeforeEach public void setup() { + TestConfigDataLocationResolver.instance = new MyTestBean(); + System.setProperty("VCAP_SERVICES", + "{\"user-provided\":[{\"label\": \"user-provided\",\"name\": \"myvcap\",\"myvar\": \"myval\"}]}"); context = new SpringApplication(TestConfiguration.class).run("--spring.datasource.hikari.read-only=false", - "--spring.profiles.active=configdatarefresh", "--" + EPP_ENABLED + "=true", "--server.port=0"); + "--spring.profiles.active=configdatarefresh", "--" + TestEnvPostProcessor.EPP_ENABLED + "=true", + "--server.port=0"); properties = context.getBean(TestProperties.class); environment = context.getBean(ConfigurableEnvironment.class); refresher = context.getBean(ContextRefresher.class); @@ -78,9 +59,12 @@ public class ConfigDataContextRefresherIntegrationTests { @AfterEach public void after() { + System.clearProperty("VCAP_SERVICES"); if (context != null) { context.close(); } + TestConfigDataLocationResolver.count.set(1); + TestConfigDataLocationResolver.instance = null; } @Test @@ -94,12 +78,12 @@ public class ConfigDataContextRefresherIntegrationTests { @Test public void testAdditionalPropertySourcesToRetain() { - then(environment.getProperty(EPP_VALUE)).isEqualTo("1"); + then(environment.getProperty(TestEnvPostProcessor.EPP_VALUE)).isEqualTo("1"); // ...and then refresh, to see if property source is retained during refresh // that means an updated test datasource with EPP_VALUE set to 10 TestConfigDataLocationResolver.count.set(10); this.refresher.refresh(); - then(environment.getProperty(EPP_VALUE)).isEqualTo("10"); + then(environment.getProperty(TestEnvPostProcessor.EPP_VALUE)).isEqualTo("10"); } @Test @@ -112,6 +96,13 @@ public class ConfigDataContextRefresherIntegrationTests { then(this.properties.getMessage()).isEqualTo("Hello scope!"); } + @Test + public void testVcapPlaceholderAfterRefresh() { + // an error will be thrown if count is 99 and myplaceholder contains ${vcap + TestConfigDataLocationResolver.count.set(99); + this.refresher.refresh(); + } + @Test public void testUpdateHikari() { then(this.properties.getMessage()).isEqualTo("Hello scope!"); @@ -138,84 +129,6 @@ public class ConfigDataContextRefresherIntegrationTests { then(bootstrapContext.isRegistered(MyTestBean.class)).isTrue(); } - protected static class TestEnvPostProcessor implements EnvironmentPostProcessor, Ordered { - - @Override - public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { - if (environment.getProperty(EPP_ENABLED, Boolean.class, false)) { - Map source = new HashMap<>(); - source.put("spring.cloud.refresh.additional-property-sources-to-retain", getClass().getSimpleName()); - source.put("spring.config.import", "testdatasource:"); - MapPropertySource propertySource = new MapPropertySource(getClass().getSimpleName(), source); - environment.getPropertySources().addFirst(propertySource); - } - } - - @Override - public int getOrder() { - return ConfigDataEnvironmentPostProcessor.ORDER - 1; - } - - } - - protected static class TestConfigDataResource extends ConfigDataResource { - - private final int count; - - public TestConfigDataResource(int count) { - this.count = count; - } - - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - TestConfigDataResource that = (TestConfigDataResource) o; - return Objects.equals(this.count, that.count); - } - - @Override - public int hashCode() { - return Objects.hash(this.count); - } - - } - - protected static class TestConfigDataLocationResolver - implements ConfigDataLocationResolver { - - static AtomicInteger count = new AtomicInteger(1); - - @Override - public boolean isResolvable(ConfigDataLocationResolverContext context, ConfigDataLocation location) { - return location.hasPrefix("testdatasource:"); - } - - @Override - public List resolve(ConfigDataLocationResolverContext context, - ConfigDataLocation location) - throws ConfigDataLocationNotFoundException, ConfigDataResourceNotFoundException { - context.getBootstrapContext().registerIfAbsent(MyTestBean.class, InstanceSupplier.of(new MyTestBean())); - return Collections.singletonList(new TestConfigDataResource(count.get())); - } - - } - - protected static class TestConfigDataLoader implements ConfigDataLoader { - - @Override - public ConfigData load(ConfigDataLoaderContext context, TestConfigDataResource resource) - throws ConfigDataResourceNotFoundException { - Map stringStringMap = Collections.singletonMap(EPP_VALUE, resource.count); - return new ConfigData( - Collections.singletonList(new MapPropertySource("testconfigdatadatasource", stringStringMap))); - } - - } - protected static class MyTestBean { } diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestConfigDataLoader.java b/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestConfigDataLoader.java new file mode 100644 index 00000000..3b35f850 --- /dev/null +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestConfigDataLoader.java @@ -0,0 +1,36 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.context.test; + +import java.util.Collections; + +import org.springframework.boot.context.config.ConfigData; +import org.springframework.boot.context.config.ConfigDataLoader; +import org.springframework.boot.context.config.ConfigDataLoaderContext; +import org.springframework.boot.context.config.ConfigDataResourceNotFoundException; +import org.springframework.core.env.MapPropertySource; + +public class TestConfigDataLoader implements ConfigDataLoader { + + @Override + public ConfigData load(ConfigDataLoaderContext context, TestConfigDataResource resource) + throws ConfigDataResourceNotFoundException { + return new ConfigData( + Collections.singletonList(new MapPropertySource("testconfigdatadatasource", resource.props))); + } + +} diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestConfigDataLocationResolver.java b/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestConfigDataLocationResolver.java new file mode 100644 index 00000000..6738c230 --- /dev/null +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestConfigDataLocationResolver.java @@ -0,0 +1,64 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.context.test; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +import org.springframework.boot.BootstrapRegistry; +import org.springframework.boot.context.config.ConfigDataLocation; +import org.springframework.boot.context.config.ConfigDataLocationNotFoundException; +import org.springframework.boot.context.config.ConfigDataLocationResolver; +import org.springframework.boot.context.config.ConfigDataLocationResolverContext; +import org.springframework.boot.context.config.ConfigDataResourceNotFoundException; +import org.springframework.boot.context.properties.bind.Bindable; + +public class TestConfigDataLocationResolver implements ConfigDataLocationResolver { + + public static AtomicInteger count = new AtomicInteger(1); + + public static Map config = new HashMap<>(); + + public static Object instance; + + @Override + public boolean isResolvable(ConfigDataLocationResolverContext context, ConfigDataLocation location) { + return location.hasPrefix("testdatasource:"); + } + + @Override + public List resolve(ConfigDataLocationResolverContext context, ConfigDataLocation location) + throws ConfigDataLocationNotFoundException, ConfigDataResourceNotFoundException { + if (instance != null) { + BootstrapRegistry.InstanceSupplier supplier = BootstrapRegistry.InstanceSupplier.of(instance); + Class aClass = (Class) instance.getClass(); + context.getBootstrapContext().registerIfAbsent(aClass, supplier); + } + String myplaceholder = context.getBinder().bind("myplaceholder", Bindable.of(String.class)).orElse("notfound"); + HashMap props = new HashMap<>(config); + props.put(TestEnvPostProcessor.EPP_VALUE, count.get()); + if (count.get() == 99 && myplaceholder.contains("${vcap")) { + throw new ConfigDataResourceNotFoundException(new TestConfigDataResource(props), + new IllegalArgumentException("placeholder not resolved")); + } + return Collections.singletonList(new TestConfigDataResource(props)); + } + +} diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestConfigDataResource.java b/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestConfigDataResource.java new file mode 100644 index 00000000..5730e185 --- /dev/null +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestConfigDataResource.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.context.test; + +import java.util.HashMap; +import java.util.Objects; + +import org.springframework.boot.context.config.ConfigDataResource; + +public class TestConfigDataResource extends ConfigDataResource { + + final HashMap props; + + public TestConfigDataResource(HashMap props) { + this.props = props; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TestConfigDataResource that = (TestConfigDataResource) o; + return Objects.equals(this.props, that.props); + } + + @Override + public int hashCode() { + return Objects.hash(this.props); + } + +} diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestEnvPostProcessor.java b/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestEnvPostProcessor.java new file mode 100644 index 00000000..9c5299b3 --- /dev/null +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/context/test/TestEnvPostProcessor.java @@ -0,0 +1,51 @@ +/* + * Copyright 2013-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.context.test; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.Ordered; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; + +public class TestEnvPostProcessor implements EnvironmentPostProcessor, Ordered { + + public static final String EPP_ENABLED = "configdatarefresh.epp.enabled"; + + public static final String EPP_VALUE = "configdatarefresh.epp.count"; + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + if (environment.getProperty(EPP_ENABLED, Boolean.class, false)) { + Map source = new HashMap<>(); + source.put("spring.cloud.refresh.additional-property-sources-to-retain", getClass().getSimpleName()); + source.put("spring.config.import", "testdatasource:"); + MapPropertySource propertySource = new MapPropertySource(getClass().getSimpleName(), source); + environment.getPropertySources().addFirst(propertySource); + } + } + + @Override + public int getOrder() { + return ConfigDataEnvironmentPostProcessor.ORDER - 1; + } + +} diff --git a/spring-cloud-context/src/test/resources/META-INF/spring.factories b/spring-cloud-context/src/test/resources/META-INF/spring.factories index 86d51e5a..ca038dad 100644 --- a/spring-cloud-context/src/test/resources/META-INF/spring.factories +++ b/spring-cloud-context/src/test/resources/META-INF/spring.factories @@ -4,12 +4,12 @@ org.springframework.cloud.bootstrap.TestBootstrapConfiguration,\ org.springframework.cloud.bootstrap.TestHigherPriorityBootstrapConfiguration org.springframework.boot.env.EnvironmentPostProcessor=\ -org.springframework.cloud.context.refresh.ConfigDataContextRefresherIntegrationTests.TestEnvPostProcessor +org.springframework.cloud.context.test.TestEnvPostProcessor # ConfigData Location Resolvers org.springframework.boot.context.config.ConfigDataLocationResolver=\ -org.springframework.cloud.context.refresh.ConfigDataContextRefresherIntegrationTests.TestConfigDataLocationResolver +org.springframework.cloud.context.test.TestConfigDataLocationResolver # ConfigData Loaders org.springframework.boot.context.config.ConfigDataLoader=\ -org.springframework.cloud.context.refresh.ConfigDataContextRefresherIntegrationTests.TestConfigDataLoader \ No newline at end of file +org.springframework.cloud.context.test.TestConfigDataLoader \ No newline at end of file diff --git a/spring-cloud-context/src/test/resources/application.properties b/spring-cloud-context/src/test/resources/application.properties index 16118aeb..d92f2ea4 100644 --- a/spring-cloud-context/src/test/resources/application.properties +++ b/spring-cloud-context/src/test/resources/application.properties @@ -7,3 +7,4 @@ debug:true #logging.level.org.springframework.context.annotation: DEBUG logging.level.org.hibernate=ERROR logging.level.com.zaxxer.hikari=ERROR +myplaceholder=${vcap.services.myvcap.myvar}