Ignore properties files in hidden directories
This commit modifies the logic for finding properties files using wildcard paths to ignore files if any part of the file path contains a hidden directory. Hidden directories are common when Kubernetes mounts config maps onto volumes in a pod, which was causing the same properties files to be loaded multiple times. Fixes gh-23160
This commit is contained in:
parent
37cbf1bb2d
commit
43cfebaca0
|
@ -18,6 +18,8 @@ package org.springframework.boot.context.config;
|
|||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
@ -108,6 +110,7 @@ import org.springframework.util.StringUtils;
|
|||
* @author Andy Wilkinson
|
||||
* @author Eddú Meléndez
|
||||
* @author Madhura Bhave
|
||||
* @author Scott Frederick
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered {
|
||||
|
@ -519,6 +522,14 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
|
|||
}
|
||||
continue;
|
||||
}
|
||||
if (resource.isFile() && hasHiddenPathElement(resource)) {
|
||||
if (this.logger.isTraceEnabled()) {
|
||||
StringBuilder description = getDescription("Skipped location with hidden path element ",
|
||||
location, resource, profile);
|
||||
this.logger.trace(description);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
String name = "applicationConfig: [" + getLocationName(location, resource) + "]";
|
||||
List<Document> documents = loadDocuments(loader, name, resource);
|
||||
if (CollectionUtils.isEmpty(documents)) {
|
||||
|
@ -555,6 +566,16 @@ public class ConfigFileApplicationListener implements EnvironmentPostProcessor,
|
|||
}
|
||||
}
|
||||
|
||||
private boolean hasHiddenPathElement(Resource resource) throws IOException {
|
||||
String cleanPath = StringUtils.cleanPath(resource.getFile().getAbsolutePath());
|
||||
for (Path value : Paths.get(cleanPath)) {
|
||||
if (value.toString().startsWith(".")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private String getLocationName(String location, Resource resource) {
|
||||
if (!location.contains("*")) {
|
||||
return location;
|
||||
|
|
|
@ -75,6 +75,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
|||
* @author Dave Syer
|
||||
* @author Eddú Meléndez
|
||||
* @author Madhura Bhave
|
||||
* @author Scott Frederick
|
||||
*/
|
||||
@ExtendWith(OutputCaptureExtension.class)
|
||||
class ConfigFileApplicationListenerTests {
|
||||
|
@ -1080,6 +1081,16 @@ class ConfigFileApplicationListenerTests {
|
|||
assertThat(this.environment.getProperty("third.property")).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void locationsWithWildcardDirectoriesShouldIgnoreHiddenDirectories() {
|
||||
String location = "file:src/test/resources/config/*/";
|
||||
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.environment,
|
||||
"spring.config.location=" + location);
|
||||
this.initializer.setSearchNames("testproperties");
|
||||
this.initializer.postProcessEnvironment(this.environment, this.application);
|
||||
assertThat(this.environment.getProperty("fourth.property")).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void locationsWithWildcardDirectoriesShouldLoadAllFilesThatMatch() {
|
||||
String location = "file:src/test/resources/config/*/";
|
||||
|
@ -1124,6 +1135,16 @@ class ConfigFileApplicationListenerTests {
|
|||
assertThat(second).isEqualTo("ball");
|
||||
}
|
||||
|
||||
@Test
|
||||
void locationsWithWildcardFilesShouldIgnoreHiddenDirectories() {
|
||||
String location = "file:src/test/resources/config/*/testproperties.properties";
|
||||
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.environment,
|
||||
"spring.config.location=" + location);
|
||||
this.initializer.setSearchNames("testproperties");
|
||||
this.initializer.postProcessEnvironment(this.environment, this.application);
|
||||
assertThat(this.environment.getProperty("fourth.property")).isNull();
|
||||
}
|
||||
|
||||
private Condition<ConfigurableEnvironment> matchingPropertySource(final String sourceName) {
|
||||
return new Condition<ConfigurableEnvironment>("environment containing property source " + sourceName) {
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
fourth.property=shouldbehidden
|
Loading…
Reference in New Issue