From 02f21f71c4f10b1e5ee6e42a9593c346f810bd31 Mon Sep 17 00:00:00 2001 From: Jinghao Song Date: Fri, 29 Sep 2023 14:54:31 +0800 Subject: [PATCH] Fix #1285 Spring Cloud activates unexpected profiles when some conditions met --- .../PropertySourceBootstrapConfiguration.java | 5 +++++ .../config/BootstrapConfigurationTests.java | 22 +++++++++++++++++++ .../src/test/resources/application.properties | 1 + 3 files changed, 28 insertions(+) diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceBootstrapConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceBootstrapConfiguration.java index cc3e94344..0aaaf736e 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceBootstrapConfiguration.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/config/PropertySourceBootstrapConfiguration.java @@ -285,6 +285,11 @@ private Set addIncludedProfilesTo(Set profiles, PropertySource addActiveProfilesTo(List profiles, PropertySource propertySource, ConfigurableEnvironment environment) { + // According to Spring Boot, "spring.profiles.active" should have priority, + // only value from property source with the highest priority wins. + // Once settled, ignore others + if(!profiles.isEmpty()) + return profiles; return addProfilesTo(profiles, propertySource, AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, environment); } diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/config/BootstrapConfigurationTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/config/BootstrapConfigurationTests.java index 90209b2d1..758821e9f 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/config/BootstrapConfigurationTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/config/BootstrapConfigurationTests.java @@ -794,4 +794,26 @@ public void setFoo(List foo) { } + @Test + void activeAndIncludeProfileFromBootstrapPropertySource_WhenMultiplePlacesHaveActiveProfileProperties_ShouldOnlyAcceptTheTopPriority() { + String[] properties = new String[]{"spring.config.use-legacy-processing=true"}; + this.context = new SpringApplicationBuilder() + .web(WebApplicationType.NONE) + .properties(properties) + .sources(BareConfiguration.class) + .run("--spring.profiles.active=prod,secure"); + then(this.context.getEnvironment().acceptsProfiles("prod", "secure")).isTrue(); + // active profile from property sources with lower priority should not be included + then(this.context.getEnvironment().acceptsProfiles("local")).isFalse(); + then(this.context.getEnvironment().getActiveProfiles()).contains("prod", "secure"); + then(this.context.getEnvironment().getActiveProfiles()).doesNotContain("local"); + // check if active profile value could possibly exist in other property sources with lower priority + then(this.context.getEnvironment() + .getPropertySources() + .stream() + .map(p -> p.getProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME)) + .anyMatch("local"::equals) + ).isTrue(); + } + } diff --git a/spring-cloud-context/src/test/resources/application.properties b/spring-cloud-context/src/test/resources/application.properties index d92f2ea44..4795a6c54 100644 --- a/spring-cloud-context/src/test/resources/application.properties +++ b/spring-cloud-context/src/test/resources/application.properties @@ -8,3 +8,4 @@ debug:true logging.level.org.hibernate=ERROR logging.level.com.zaxxer.hikari=ERROR myplaceholder=${vcap.services.myvcap.myvar} +spring.profiles.active=local \ No newline at end of file