Browse Source

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
pull/26775/head
Phillip Webb 5 years ago
parent
commit
d1b256a169
  1. 3
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/StandardConfigDataLocationResolver.java
  2. 19
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java
  3. 2
      spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import-dev.properties
  4. 2
      spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import.properties
  5. 2
      spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-dev.properties
  6. 2
      spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported-dev.properties
  7. 2
      spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported.properties
  8. 2
      spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant.properties
  9. 1
      spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p1.properties
  10. 1
      spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p2.properties
  11. 1
      spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import.properties
  12. 2
      spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-p1.properties
  13. 2
      spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import.properties

3
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/config/StandardConfigDataLocationResolver.java

@ -135,6 +135,9 @@ public class StandardConfigDataLocationResolver @@ -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));
}

19
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/config/ConfigDataEnvironmentPostProcessorIntegrationTests.java

@ -614,7 +614,8 @@ class ConfigDataEnvironmentPostProcessorIntegrationTests { @@ -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 { @@ -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 { @@ -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) {

2
spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import-dev.properties

@ -1,2 +1,2 @@ @@ -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

2
spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-and-direct-profile-import.properties

@ -1,2 +1,2 @@ @@ -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

2
spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-dev.properties

@ -1 +1 @@ @@ -1 +1 @@
my.value=notimported-dev
my.value=application-import-with-profile-variant-dev

2
spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported-dev.properties

@ -1 +1 @@ @@ -1 +1 @@
my.value=iwasimported-dev
my.value=application-import-with-profile-variant-imported-dev

2
spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant-imported.properties

@ -1 +1 @@ @@ -1 +1 @@
my.value=iwasimported
my.value=application-import-with-profile-variant-imported

2
spring-boot-project/spring-boot/src/test/resources/application-import-with-profile-variant.properties

@ -1,2 +1,2 @@ @@ -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

1
spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p1.properties

@ -0,0 +1 @@ @@ -0,0 +1 @@
application-profile-specific-import-with-import-import-p1=true

1
spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import-p2.properties

@ -0,0 +1 @@ @@ -0,0 +1 @@
application-profile-specific-import-with-import-import-p2=true

1
spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-import.properties

@ -0,0 +1 @@ @@ -0,0 +1 @@
application-profile-specific-import-with-import-import=true

2
spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import-p1.properties

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
application-profile-specific-import-with-import-p1=true
spring.config.import=application-profile-specific-import-with-import-import.properties

2
spring-boot-project/spring-boot/src/test/resources/application-profile-specific-import-with-import.properties

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
spring.profiles.active=p1,p2
application-profile-specific-import-with-import=true
Loading…
Cancel
Save