Fail hard if spring.profiles.include is used with new config processing

Closes gh-22693
This commit is contained in:
Madhura Bhave 2020-08-05 14:41:32 -07:00
parent e719a246df
commit b9abcf1615
3 changed files with 18 additions and 15 deletions

View File

@ -1742,21 +1742,9 @@ The configprop:spring.profiles.active[] property follows the same ordering rules
This means that you can specify active profiles in `application.properties` and then *replace* them by using the command line switch. This means that you can specify active profiles in `application.properties` and then *replace* them by using the command line switch.
Sometimes, it is useful to have properties that *add* to the active profiles rather than replace them. Sometimes, it is useful to have properties that *add* to the active profiles rather than replace them.
The configprop:spring.profiles.include[] property can be used to unconditionally add active profiles. The `SpringApplication` entry point has a Java API for setting additional profiles (that is, on top of those activated by the configprop:spring.profiles.active[] property).
The `SpringApplication` entry point also has a Java API for setting additional profiles (that is, on top of those activated by the configprop:spring.profiles.active[] property).
See the `setAdditionalProfiles()` method in {spring-boot-module-api}/SpringApplication.html[SpringApplication]. See the `setAdditionalProfiles()` method in {spring-boot-module-api}/SpringApplication.html[SpringApplication].
Profile groups, which are described in the <<boot-features-profiles-groups,next section>> can also be used to add active profiles if a given profile is active.
For example, when an application with the following properties is run by using the switch, `--spring.profiles.active=custom`, the `other` and `extra` profiles are still activated:
[source,yaml,indent=0]
----
---
my.property: fromyamlfile
spring.profiles.include:
- other
- extra
----
[[boot-features-profiles-groups]] [[boot-features-profiles-groups]]

View File

@ -35,7 +35,7 @@ import org.springframework.boot.context.properties.source.ConfigurationPropertyS
*/ */
public class InvalidConfigDataPropertyException extends ConfigDataException { public class InvalidConfigDataPropertyException extends ConfigDataException {
private static final Map<ConfigurationPropertyName, ConfigurationPropertyName> ERROR = Collections.emptyMap(); private static final Map<ConfigurationPropertyName, ConfigurationPropertyName> ERROR;
private static final Map<ConfigurationPropertyName, ConfigurationPropertyName> WARNING; private static final Map<ConfigurationPropertyName, ConfigurationPropertyName> WARNING;
static { static {
@ -43,6 +43,10 @@ public class InvalidConfigDataPropertyException extends ConfigDataException {
warning.put(ConfigurationPropertyName.of("spring.profiles"), warning.put(ConfigurationPropertyName.of("spring.profiles"),
ConfigurationPropertyName.of("spring.config.activate.on-profile")); ConfigurationPropertyName.of("spring.config.activate.on-profile"));
WARNING = Collections.unmodifiableMap(warning); WARNING = Collections.unmodifiableMap(warning);
Map<ConfigurationPropertyName, ConfigurationPropertyName> error = new LinkedHashMap<>();
error.put(ConfigurationPropertyName.of("spring.profiles.include"),
ConfigurationPropertyName.of("spring.profiles.group"));
ERROR = Collections.unmodifiableMap(error);
} }
private final ConfigurationProperty property; private final ConfigurationProperty property;

View File

@ -123,6 +123,17 @@ class InvalidConfigDataPropertyExceptionTests {
+ "'spring.config.activate.on-profile' [origin: \"spring.profiles\" from property source \"mockProperties\"]"); + "'spring.config.activate.on-profile' [origin: \"spring.profiles\" from property source \"mockProperties\"]");
} }
@Test
void throwOrWarnWhenHasErrorPropertyThrowsException() {
MockPropertySource propertySource = new MockPropertySource();
propertySource.setProperty("spring.profiles.include", "a");
ConfigDataEnvironmentContributor contributor = ConfigDataEnvironmentContributor.ofExisting(propertySource);
assertThatExceptionOfType(InvalidConfigDataPropertyException.class)
.isThrownBy(() -> InvalidConfigDataPropertyException.throwOrWarn(this.logger, contributor))
.withMessage("Property 'spring.profiles.include' is invalid and should be replaced with "
+ "'spring.profiles.group' [origin: \"spring.profiles.include\" from property source \"mockProperties\"]");
}
private static class TestConfigDataLocation extends ConfigDataLocation { private static class TestConfigDataLocation extends ConfigDataLocation {
@Override @Override