diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/BootstrapApplicationListener.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/BootstrapApplicationListener.java index 9e906e61..39e0d553 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/BootstrapApplicationListener.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/BootstrapApplicationListener.java @@ -72,8 +72,8 @@ public class BootstrapApplicationListener implements if (environment.getPropertySources().contains("bootstrapInProgress")) { return; } - ConfigurableApplicationContext context = bootstrapServiceContext( - environment, event.getSpringApplication()); + ConfigurableApplicationContext context = bootstrapServiceContext(environment, + event.getSpringApplication()); apply(context, event.getSpringApplication(), environment); } @@ -189,8 +189,9 @@ public class BootstrapApplicationListener implements public int getOrder() { // Need to run not too late (so not unordered), so that, for instance, the // ContextIdApplicationContextInitializer runs later and picks up the merged - // Environment - return 0; + // Environment. Also not too early so that other initializers can pick up the + // parent (especially the Environment). + return Ordered.HIGHEST_PRECEDENCE + 10; } @Override diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfiguration.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfiguration.java index 4333ab91..4751d2d3 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfiguration.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfiguration.java @@ -90,11 +90,11 @@ public class EncryptionBootstrapConfiguration { } @Bean - public EnvironmentDecryptApplicationListener environmentDecryptApplicationListener() { + public EnvironmentDecryptApplicationInitializer environmentDecryptApplicationListener() { if (encryptor == null) { encryptor = new FailsafeTextEncryptor(); } - EnvironmentDecryptApplicationListener listener = new EnvironmentDecryptApplicationListener(encryptor); + EnvironmentDecryptApplicationInitializer listener = new EnvironmentDecryptApplicationInitializer(encryptor); listener.setFailOnError(key.isFailOnError()); return listener; } diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationListener.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java similarity index 91% rename from spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationListener.java rename to spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java index eab7f6ef..163e71d8 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationListener.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java @@ -20,7 +20,6 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.boot.context.config.ConfigFileApplicationListener; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.Ordered; @@ -35,19 +34,19 @@ import org.springframework.security.crypto.encrypt.TextEncryptor; * @author Dave Syer * */ -public class EnvironmentDecryptApplicationListener implements +public class EnvironmentDecryptApplicationInitializer implements ApplicationContextInitializer, Ordered { private static Log logger = LogFactory - .getLog(EnvironmentDecryptApplicationListener.class); + .getLog(EnvironmentDecryptApplicationInitializer.class); - private int order = ConfigFileApplicationListener.DEFAULT_ORDER + 1; + private int order = Ordered.HIGHEST_PRECEDENCE + 15; private TextEncryptor encryptor; private boolean failOnError = true; - public EnvironmentDecryptApplicationListener(TextEncryptor encryptor) { + public EnvironmentDecryptApplicationInitializer(TextEncryptor encryptor) { this.encryptor = encryptor; } diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapDisabledAutoConfigurationIntegrationTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapDisabledAutoConfigurationIntegrationTests.java index 7b44ea72..0a11c681 100644 --- a/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapDisabledAutoConfigurationIntegrationTests.java +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapDisabledAutoConfigurationIntegrationTests.java @@ -1,29 +1,29 @@ package org.springframework.cloud.bootstrap; +import static org.junit.Assert.assertFalse; + import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.cloud.bootstrap.BootstrapDisabledAutoConfigurationIntegrationTests.Application; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ActiveProfiles; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) -@IntegrationTest({ "server.port:0", "spring.cloud.bootstrap.enabled:false" }) -@WebAppConfiguration -@ActiveProfiles("test") +@IntegrationTest("spring.cloud.bootstrap.enabled:false") public class BootstrapDisabledAutoConfigurationIntegrationTests { - - @Value("${local.server.port}") - private int port; + + @Autowired + private ConfigurableEnvironment environment; @Test - public void contextLoads() { + public void noBootstrapProperties() { + assertFalse(environment.getPropertySources().contains("bootstrap")); } @EnableAutoConfiguration diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapOrderingAutoConfigurationIntegrationTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapOrderingAutoConfigurationIntegrationTests.java new file mode 100644 index 00000000..74a4a66c --- /dev/null +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/BootstrapOrderingAutoConfigurationIntegrationTests.java @@ -0,0 +1,48 @@ +package org.springframework.cloud.bootstrap; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.IntegrationTest; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.cloud.bootstrap.BootstrapOrderingAutoConfigurationIntegrationTests.Application; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = Application.class) +@IntegrationTest("encrypt.key:deadbeef") +@ActiveProfiles("encrypt") +public class BootstrapOrderingAutoConfigurationIntegrationTests { + + @Autowired + private ConfigurableEnvironment environment; + + @Test + public void bootstrapPropertiesExist() { + assertTrue(environment.getPropertySources().contains("bootstrap")); + } + + @Test + public void normalPropertiesDecrypted() { + assertEquals("foo", environment.resolvePlaceholders("${foo}")); + } + + @Test + public void bootstrapPropertiesDecrypted() { + assertEquals("bar", environment.resolvePlaceholders("${bar}")); + } + + @EnableAutoConfiguration + @Configuration + protected static class Application { + + } + +} diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationListenerTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationListenerTests.java index 32c422ac..d9fb86ab 100644 --- a/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationListenerTests.java +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationListenerTests.java @@ -29,7 +29,7 @@ import org.springframework.security.crypto.encrypt.Encryptors; */ public class EnvironmentDecryptApplicationListenerTests { - private EnvironmentDecryptApplicationListener listener = new EnvironmentDecryptApplicationListener(Encryptors.noOpText()); + private EnvironmentDecryptApplicationInitializer listener = new EnvironmentDecryptApplicationInitializer(Encryptors.noOpText()); @Test public void decryptCipherKey() { @@ -41,7 +41,7 @@ public class EnvironmentDecryptApplicationListenerTests { @Test(expected=IllegalStateException.class) public void errorOnDecrypt() { - listener = new EnvironmentDecryptApplicationListener(Encryptors.text("deadbeef", "AFFE37")); + listener = new EnvironmentDecryptApplicationInitializer(Encryptors.text("deadbeef", "AFFE37")); ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(); EnvironmentTestUtils.addEnvironment(context, "foo: {cipher}bar"); listener.initialize(context); @@ -50,7 +50,7 @@ public class EnvironmentDecryptApplicationListenerTests { @Test public void errorOnDecryptWithEmpty() { - listener = new EnvironmentDecryptApplicationListener(Encryptors.text("deadbeef", "AFFE37")); + listener = new EnvironmentDecryptApplicationInitializer(Encryptors.text("deadbeef", "AFFE37")); listener.setFailOnError(false); ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(); EnvironmentTestUtils.addEnvironment(context, "foo: {cipher}bar"); diff --git a/spring-cloud-config-client/src/test/resources/application-encrypt.properties b/spring-cloud-config-client/src/test/resources/application-encrypt.properties new file mode 100644 index 00000000..b1329f64 --- /dev/null +++ b/spring-cloud-config-client/src/test/resources/application-encrypt.properties @@ -0,0 +1 @@ +foo: {cipher}e4e061f9fe39ba5b14d8012d2f17d39775606039409b71ed4be0fdd033d5324a diff --git a/spring-cloud-config-client/src/test/resources/bootstrap-encrypt.properties b/spring-cloud-config-client/src/test/resources/bootstrap-encrypt.properties new file mode 100644 index 00000000..3035e009 --- /dev/null +++ b/spring-cloud-config-client/src/test/resources/bootstrap-encrypt.properties @@ -0,0 +1 @@ +bar: {cipher}6154ca04d4bb6144d672c4e3d750b5147116dd381946d51fa44f8bc25dc256f4 \ No newline at end of file diff --git a/spring-cloud-config-client/src/test/resources/bootstrap.properties b/spring-cloud-config-client/src/test/resources/bootstrap.properties index 878343cb..9ec10bf9 100644 --- a/spring-cloud-config-client/src/test/resources/bootstrap.properties +++ b/spring-cloud-config-client/src/test/resources/bootstrap.properties @@ -1,2 +1,2 @@ spring.main.sources: org.springframework.cloud.bootstrap.config.BootstrapConfigurationTests.PropertySourceConfiguration -info.name: child \ No newline at end of file +info.name: child