diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyName.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyName.java index ec2bdbca57..2c8bd8b64e 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyName.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/source/ConfigurationPropertyName.java @@ -510,6 +510,18 @@ public final class ConfigurationPropertyName implements Comparable 0) { - result.append("_"); + result.append('_'); } result.append(name.getElement(i, Form.UNIFORM).toUpperCase(Locale.ENGLISH)); } @@ -69,7 +69,7 @@ final class SystemEnvironmentPropertyMapper implements PropertyMapper { StringBuilder result = new StringBuilder(); for (int i = 0; i < name.getNumberOfElements(); i++) { if (result.length() > 0) { - result.append("_"); + result.append('_'); } result.append(convertLegacyNameElement(name.getElement(i, Form.ORIGINAL))); } @@ -116,13 +116,19 @@ final class SystemEnvironmentPropertyMapper implements PropertyMapper { if (!hasDashedEntries(name)) { return false; } + ConfigurationPropertyName legacyCompatibleName = buildLegacyCompatibleName(name); + return legacyCompatibleName != null && legacyCompatibleName.isAncestorOf(candidate); + } + + private ConfigurationPropertyName buildLegacyCompatibleName(ConfigurationPropertyName name) { StringBuilder legacyCompatibleName = new StringBuilder(); for (int i = 0; i < name.getNumberOfElements(); i++) { - legacyCompatibleName.append((i != 0) ? "." : ""); + if (i != 0) { + legacyCompatibleName.append('.'); + } legacyCompatibleName.append(name.getElement(i, Form.DASHED).replace('-', '.')); } - return ConfigurationPropertyName.isValid(legacyCompatibleName) - && ConfigurationPropertyName.of(legacyCompatibleName).isAncestorOf(candidate); + return ConfigurationPropertyName.ofIfValid(legacyCompatibleName); } boolean hasDashedEntries(ConfigurationPropertyName name) { diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/ConfigurationPropertyNameTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/ConfigurationPropertyNameTests.java index 4668785331..ee12aab0c2 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/ConfigurationPropertyNameTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/ConfigurationPropertyNameTests.java @@ -210,6 +210,18 @@ class ConfigurationPropertyNameTests { assertThat(name.append("foo").toString()).isEqualTo("foo"); } + @Test + void ofIfValidWhenNameIsValidReturnsName() { + ConfigurationPropertyName name = ConfigurationPropertyName.ofIfValid("spring.bo-ot"); + assertThat(name).hasToString("spring.bo-ot"); + } + + @Test + void ofIfValidWhenNameIsNotValidReturnsNull() { + ConfigurationPropertyName name = ConfigurationPropertyName.ofIfValid("spring.bo!oot"); + assertThat(name).isNull(); + } + @Test void adaptWhenNameIsNullShouldThrowException() { assertThatIllegalArgumentException().isThrownBy(() -> ConfigurationPropertyName.adapt(null, '.'))