diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/AliasedConfigurationPropertySource.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/AliasedConfigurationPropertySource.java index ea9496881b..42beffcb55 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/AliasedConfigurationPropertySource.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/AliasedConfigurationPropertySource.java @@ -65,6 +65,15 @@ class AliasedConfigurationPropertySource implements ConfigurationPropertySource return aliasResult; } } + for (ConfigurationPropertyName from : getAliases()) { + for (ConfigurationPropertyName alias : getAliases().getAliases(from)) { + if (name.isAncestorOf(alias)) { + if (this.source.getConfigurationProperty(from) != null) { + return ConfigurationPropertyState.PRESENT; + } + } + } + } return ConfigurationPropertyState.ABSENT; } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyNameAliases.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyNameAliases.java index f668bae35f..3ca9f6beb6 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyNameAliases.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyNameAliases.java @@ -18,6 +18,7 @@ package org.springframework.boot.context.properties.source; import java.util.Arrays; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -33,7 +34,8 @@ import org.springframework.util.MultiValueMap; * @since 2.0.0 * @see ConfigurationPropertySource#withAliases(ConfigurationPropertyNameAliases) */ -public final class ConfigurationPropertyNameAliases { +public final class ConfigurationPropertyNameAliases + implements Iterable { private final MultiValueMap aliases = new LinkedMultiValueMap<>(); @@ -74,4 +76,9 @@ public final class ConfigurationPropertyNameAliases { .findFirst().orElse(null); } + @Override + public Iterator iterator() { + return this.aliases.keySet().iterator(); + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/AliasedConfigurationPropertySourceTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/AliasedConfigurationPropertySourceTests.java index ca9e4e34e5..8d4d15a527 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/AliasedConfigurationPropertySourceTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/AliasedConfigurationPropertySourceTests.java @@ -16,6 +16,8 @@ package org.springframework.boot.context.properties.source; +import java.util.Collections; + import org.junit.Test; import org.mockito.Answers; @@ -111,6 +113,16 @@ public class AliasedConfigurationPropertySourceTests { .isEqualTo(ConfigurationPropertyState.PRESENT); } + @Test + public void containsDescendantOfWhenPresentInAliasShouldReturnPresent() { + ConfigurationPropertySource source = new MapConfigurationPropertySource( + Collections.singletonMap("foo.bar", "foobar")); + ConfigurationPropertySource aliased = source + .withAliases(new ConfigurationPropertyNameAliases("foo.bar", "baz.foo")); + assertThat(aliased.containsDescendantOf(ConfigurationPropertyName.of("baz"))) + .isEqualTo(ConfigurationPropertyState.PRESENT); + } + private Object getValue(ConfigurationPropertySource source, String name) { ConfigurationProperty property = source .getConfigurationProperty(ConfigurationPropertyName.of(name));