Prevent indirect standard profile-specific imports
Update `StandardConfigDataLocationResolver` so that profile-specific imports can only be used when there is no parent import. Prior to this commit, given the following application.properties file: spring.profiles.active=p1,p2 spring.config.import=other.properties We would attempt to import `other.properties`, `other-p1.properties` and `other-p2.properties`. This seems quite confusing and when we really only need to support profile-specific properties for the initial root set of locations. Fixes gh-26752
This commit is contained in:
parent
ad99aa2f4a
commit
d1b256a169
|
@ -135,6 +135,9 @@ public class StandardConfigDataLocationResolver
|
|||
@Override
|
||||
public List<StandardConfigDataResource> resolveProfileSpecific(ConfigDataLocationResolverContext context,
|
||||
ConfigDataLocation location, Profiles profiles) {
|
||||
if (context.getParent() != null) {
|
||||
return null;
|
||||
}
|
||||
return resolve(getProfileSpecificReferences(context, location, profiles));
|
||||
}
|
||||
|
||||
|
|
|
@ -614,7 +614,8 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests {
|
|||
this.application.setAdditionalProfiles("dev");
|
||||
ConfigurableApplicationContext context = this.application
|
||||
.run("--spring.config.location=classpath:application-import-with-profile-variant.properties");
|
||||
assertThat(context.getEnvironment().getProperty("my.value")).isEqualTo("iwasimported-dev");
|
||||
assertThat(context.getEnvironment().getProperty("my.value"))
|
||||
.isEqualTo("application-import-with-profile-variant-dev");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -622,7 +623,8 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests {
|
|||
this.application.setAdditionalProfiles("dev");
|
||||
ConfigurableApplicationContext context = this.application.run(
|
||||
"--spring.config.location=classpath:application-import-with-profile-variant-and-direct-profile-import.properties");
|
||||
assertThat(context.getEnvironment().getProperty("my.value")).isEqualTo("iwasimported-dev");
|
||||
assertThat(context.getEnvironment().getProperty("my.value"))
|
||||
.isEqualTo("application-import-with-profile-variant-imported-dev");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -746,6 +748,19 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests {
|
|||
assertThat(environment.getProperty("test2")).isEqualTo("test2");
|
||||
}
|
||||
|
||||
@Test // gh-26752
|
||||
void runWhenHasProfileSpecificImportWithImportDoesNotImportSecondProfileSpecificFile() {
|
||||
ConfigurableApplicationContext context = this.application
|
||||
.run("--spring.config.name=application-profile-specific-import-with-import");
|
||||
ConfigurableEnvironment environment = context.getEnvironment();
|
||||
assertThat(environment.containsProperty("application-profile-specific-import-with-import")).isTrue();
|
||||
assertThat(environment.containsProperty("application-profile-specific-import-with-import-p1")).isTrue();
|
||||
assertThat(environment.containsProperty("application-profile-specific-import-with-import-p2")).isFalse();
|
||||
assertThat(environment.containsProperty("application-profile-specific-import-with-import-import")).isTrue();
|
||||
assertThat(environment.containsProperty("application-profile-specific-import-with-import-import-p1")).isFalse();
|
||||
assertThat(environment.containsProperty("application-profile-specific-import-with-import-import-p2")).isFalse();
|
||||
}
|
||||
|
||||
private Condition<ConfigurableEnvironment> matchingPropertySource(final String sourceName) {
|
||||
return new Condition<ConfigurableEnvironment>("environment containing property source " + sourceName) {
|
||||
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
spring.config.import=classpath:application-import-with-profile-variant-imported-dev.properties
|
||||
my.value=notimported-dev
|
||||
my.value=application-import-with-profile-variant-and-direct-profile-import-dev
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
spring.config.import=classpath:application-import-with-profile-variant-imported.properties
|
||||
my.value=notimported
|
||||
my.value=application-import-with-profile-variant-and-direct-profile-import
|
||||
|
|
|
@ -1 +1 @@
|
|||
my.value=notimported-dev
|
||||
my.value=application-import-with-profile-variant-dev
|
||||
|
|
|
@ -1 +1 @@
|
|||
my.value=iwasimported-dev
|
||||
my.value=application-import-with-profile-variant-imported-dev
|
||||
|
|
|
@ -1 +1 @@
|
|||
my.value=iwasimported
|
||||
my.value=application-import-with-profile-variant-imported
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
spring.config.import=classpath:application-import-with-profile-variant-imported.properties
|
||||
my.value=notimported
|
||||
my.value=application-import-with-profile-variant
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
application-profile-specific-import-with-import-import-p1=true
|
|
@ -0,0 +1 @@
|
|||
application-profile-specific-import-with-import-import-p2=true
|
|
@ -0,0 +1 @@
|
|||
application-profile-specific-import-with-import-import=true
|
|
@ -0,0 +1,2 @@
|
|||
application-profile-specific-import-with-import-p1=true
|
||||
spring.config.import=application-profile-specific-import-with-import-import.properties
|
|
@ -0,0 +1,2 @@
|
|||
spring.profiles.active=p1,p2
|
||||
application-profile-specific-import-with-import=true
|
Loading…
Reference in New Issue