From c23d8fb3757883b8cbccc728a16293692ce32cbc Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 21 Dec 2016 10:50:55 -0800 Subject: [PATCH 1/4] Ignore unresolvable placeholder in log properties Update the RelaxedPropertyResolver used to load log properties so that `${...}` patterns are ignored when possible. Fixes gh-7719 --- .../boot/bind/RelaxedPropertyResolver.java | 23 +++++++++++++++++++ .../boot/logging/LoggingSystemProperties.java | 4 ++-- .../logback/DefaultLogbackConfiguration.java | 3 ++- .../LoggingApplicationListenerTests.java | 10 ++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedPropertyResolver.java b/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedPropertyResolver.java index 80ff09f91e..c3db1fea70 100644 --- a/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedPropertyResolver.java +++ b/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedPropertyResolver.java @@ -19,7 +19,9 @@ package org.springframework.boot.bind; import java.util.Map; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; import org.springframework.core.env.PropertyResolver; +import org.springframework.core.env.PropertySourcesPropertyResolver; import org.springframework.util.Assert; /** @@ -145,4 +147,25 @@ public class RelaxedPropertyResolver implements PropertyResolver { keyPrefix); } + /** + * Return a property resolver for the environment, preferring one that ignores + * unresolvable nested placeholders. + * @param environment the source environment + * @param prefix the prefix + * @return a property resolver for the environment + * @since 1.4.3 + */ + public static RelaxedPropertyResolver ignoringUnresolvableNestedPlaceholders( + Environment environment, String prefix) { + Assert.notNull(environment, "Environment must not be null"); + PropertyResolver resolver = environment; + if (environment instanceof ConfigurableEnvironment) { + resolver = new PropertySourcesPropertyResolver( + ((ConfigurableEnvironment) environment).getPropertySources()); + ((PropertySourcesPropertyResolver) resolver) + .setIgnoreUnresolvableNestedPlaceholders(true); + } + return new RelaxedPropertyResolver(resolver, prefix); + } + } diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java index 14337f2037..91855cf44d 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java @@ -49,8 +49,8 @@ class LoggingSystemProperties { } public void apply(LogFile logFile) { - RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver( - this.environment, "logging."); + RelaxedPropertyResolver propertyResolver = RelaxedPropertyResolver + .ignoringUnresolvableNestedPlaceholders(this.environment, "logging."); setSystemProperty(propertyResolver, EXCEPTION_CONVERSION_WORD, "exception-conversion-word"); setSystemProperty(propertyResolver, CONSOLE_LOG_PATTERN, "pattern.console"); diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java b/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java index d6c4921154..d10bd1f0dc 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java @@ -72,7 +72,8 @@ class DefaultLogbackConfiguration { if (environment == null) { return new PropertySourcesPropertyResolver(null); } - return new RelaxedPropertyResolver(environment, "logging.pattern."); + return RelaxedPropertyResolver.ignoringUnresolvableNestedPlaceholders(environment, + "logging.pattern."); } public void apply(LogbackConfigurator config) { diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java index 92536c1f27..a6ac5e7d51 100644 --- a/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java @@ -467,6 +467,16 @@ public class LoggingApplicationListenerTests { assertThat(System.getProperty("PID")).isNotNull(); } + @Test + public void environmentPropertiesIgnoreUnresolvablePlaceholders() { + // gh-7719 + TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, + "logging.pattern.console=console ${pid}"); + this.initializer.initialize(this.context.getEnvironment(), + this.context.getClassLoader()); + assertThat(System.getProperty("CONSOLE_LOG_PATTERN")).isEqualTo("console ${pid}"); + } + @Test public void logFilePropertiesCanReferenceSystemProperties() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, From 138b96cf5f9536aaecdc8ebcc86cbe00a557b6ae Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 21 Dec 2016 11:18:24 -0800 Subject: [PATCH 2/4] Use unique `testRestTemplate` bean name Update `SpringBootTestContextCustomizer` to use the full qualified TestRestTemplate as the registered bean name. Prior to this commit it was possible that the customizer would replace the relatively common bean name `testRestTemplate`. Fixes gh-7711 --- .../SpringBootTestContextCustomizer.java | 2 +- ...ngBootTestEmbeddedWebEnvironmentTests.java | 4 ++ ...BootTestTestRestTemplateDefinedByUser.java | 65 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestTestRestTemplateDefinedByUser.java diff --git a/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextCustomizer.java b/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextCustomizer.java index fe3c0b2607..c7517d0c0e 100644 --- a/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextCustomizer.java +++ b/spring-boot-test/src/main/java/org/springframework/boot/test/context/SpringBootTestContextCustomizer.java @@ -62,7 +62,7 @@ class SpringBootTestContextCustomizer implements ContextCustomizer { private void registerTestRestTemplate(ConfigurableApplicationContext context, BeanDefinitionRegistry registry) { - registry.registerBeanDefinition("testRestTemplate", + registry.registerBeanDefinition(TestRestTemplate.class.getName(), new RootBeanDefinition(TestRestTemplateFactory.class)); } diff --git a/spring-boot-test/src/test/java/org/springframework/boot/test/context/AbstractSpringBootTestEmbeddedWebEnvironmentTests.java b/spring-boot-test/src/test/java/org/springframework/boot/test/context/AbstractSpringBootTestEmbeddedWebEnvironmentTests.java index 7617948e64..9fe2c8d60b 100644 --- a/spring-boot-test/src/test/java/org/springframework/boot/test/context/AbstractSpringBootTestEmbeddedWebEnvironmentTests.java +++ b/spring-boot-test/src/test/java/org/springframework/boot/test/context/AbstractSpringBootTestEmbeddedWebEnvironmentTests.java @@ -60,6 +60,10 @@ public abstract class AbstractSpringBootTestEmbeddedWebEnvironmentTests { @Autowired private TestRestTemplate restTemplate; + public WebApplicationContext getContext() { + return this.context; + } + public TestRestTemplate getRestTemplate() { return this.restTemplate; } diff --git a/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestTestRestTemplateDefinedByUser.java b/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestTestRestTemplateDefinedByUser.java new file mode 100644 index 0000000000..2887b6061e --- /dev/null +++ b/spring-boot-test/src/test/java/org/springframework/boot/test/context/SpringBootTestTestRestTemplateDefinedByUser.java @@ -0,0 +1,65 @@ +/* + * Copyright 2012-2016 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 + * + * http://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.boot.test.context; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringBootTest} configured with {@link WebEnvironment#RANDOM_PORT}. + * + * @author Phillip Webb + * @author Andy Wilkinson + */ +@RunWith(SpringRunner.class) +@DirtiesContext +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "value=123" }) +public class SpringBootTestTestRestTemplateDefinedByUser + extends AbstractSpringBootTestEmbeddedWebEnvironmentTests { + + @Test + public void restTemplateIsUserDefined() throws Exception { + assertThat(getContext().getBean("testRestTemplate")) + .isInstanceOf(RestTemplate.class); + } + + // gh-7711 + + @Configuration + @EnableWebMvc + @RestController + protected static class Config extends AbstractConfig { + + @Bean + public RestTemplate testRestTemplate() { + return new RestTemplate(); + } + + } + +} From 2c00b4f76e2f227ce88becc948956479aa2bdf94 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 21 Dec 2016 11:20:14 -0800 Subject: [PATCH 3/4] Upgrade to Spring Data Hopper SR6 Closes gh-7602 --- spring-boot-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index 4bedde66fc..867b2fad8a 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -149,7 +149,7 @@ 1.6.6.RELEASE 1.2.3.RELEASE 3.0.7.RELEASE - Hopper-BUILD-SNAPSHOT + Hopper-SR6 0.20.0.RELEASE 4.3.6.RELEASE 1.1.4.RELEASE From 8ed769ae344535ca7f773b13bbc2cca4a75cbbd4 Mon Sep 17 00:00:00 2001 From: Kazuki Shimizu Date: Thu, 22 Dec 2016 02:39:57 +0900 Subject: [PATCH 4/4] Update to Spring Secuirty 4.1.4 Closes gh-7721 --- spring-boot-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index 867b2fad8a..74d59de114 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -158,7 +158,7 @@ 1.2.0.RELEASE 1.1.2.RELEASE 1.1.5.RELEASE - 4.1.3.RELEASE + 4.1.4.RELEASE 1.0.5.RELEASE 2.0.12.RELEASE 1.2.2.RELEASE