From e2705b2cfd51d0f96e19ab3ee80147c21ac67498 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 27 Apr 2020 13:37:54 -0700 Subject: [PATCH] Throw exception if classpath*: is used Update `ConfigFileApplicationListener` to throw a better exception if `classpath*:` is used as a location. Closes gh-21168 --- .../context/config/ConfigFileApplicationListener.java | 3 +++ .../config/ConfigFileApplicationListenerTests.java | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java index 485c5fa75ff..8dc4c84e1a0 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigFileApplicationListener.java @@ -62,6 +62,7 @@ import org.springframework.core.env.PropertySource; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; +import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -618,6 +619,8 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor, for (String path : asResolvedSet(this.environment.getProperty(propertyName), null)) { if (!path.contains("$")) { path = StringUtils.cleanPath(path); + Assert.state(!path.startsWith(ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX), + "Classpath wildard patterns cannot be used as a search location"); if (!ResourceUtils.isUrl(path)) { path = ResourceUtils.FILE_URL_PREFIX + path; } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileApplicationListenerTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileApplicationListenerTests.java index 8b1f99ecea1..cb0f9fb0769 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileApplicationListenerTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigFileApplicationListenerTests.java @@ -63,6 +63,7 @@ import org.springframework.test.context.support.TestPropertySourceUtils; import org.springframework.util.StringUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; /** * Tests for {@link ConfigFileApplicationListener}. @@ -648,6 +649,15 @@ public class ConfigFileApplicationListenerTests { matchingPropertySource("applicationConfig: [file:" + location.replace(File.separatorChar, '/') + "]")); } + @Test + public void classpathWildcardResourceThrowsException() { + TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.environment, + "spring.config.location=classpath*:override.properties"); + assertThatIllegalStateException() + .isThrownBy(() -> this.initializer.postProcessEnvironment(this.environment, this.application)) + .withMessage("Classpath wildard patterns cannot be used as a search location"); + } + @Test public void propertySourceAnnotation() { SpringApplication application = new SpringApplication(WithPropertySource.class);