diff --git a/spring-core/src/main/java/org/springframework/core/env/PropertySourcesPropertyResolver.java b/spring-core/src/main/java/org/springframework/core/env/PropertySourcesPropertyResolver.java index a9c071781fd..3558d0fa775 100644 --- a/spring-core/src/main/java/org/springframework/core/env/PropertySourcesPropertyResolver.java +++ b/spring-core/src/main/java/org/springframework/core/env/PropertySourcesPropertyResolver.java @@ -84,10 +84,14 @@ public class PropertySourcesPropertyResolver extends AbstractPropertyResolver { } Object value = propertySource.getProperty(key); if (value != null) { - if (resolveNestedPlaceholders && - (String.class.equals(targetValueType) || CharSequence.class.equals(targetValueType)) && - value instanceof CharSequence cs) { - value = resolveNestedPlaceholders(cs.toString()); + if (resolveNestedPlaceholders) { + if (value instanceof String string) { + value = resolveNestedPlaceholders(string); + } + else if ((value instanceof CharSequence cs) && (String.class.equals(targetValueType) || + CharSequence.class.equals(targetValueType))) { + value = resolveNestedPlaceholders(cs.toString()); + } } logKeyFound(key, propertySource, value); return convertValueIfNecessary(value, targetValueType); diff --git a/spring-core/src/test/java/org/springframework/core/env/PropertySourcesPropertyResolverTests.java b/spring-core/src/test/java/org/springframework/core/env/PropertySourcesPropertyResolverTests.java index 16d8d47572f..23654dfe10e 100644 --- a/spring-core/src/test/java/org/springframework/core/env/PropertySourcesPropertyResolverTests.java +++ b/spring-core/src/test/java/org/springframework/core/env/PropertySourcesPropertyResolverTests.java @@ -325,6 +325,14 @@ class PropertySourcesPropertyResolverTests { .hasToString("${p1}:${p2}"); } + @Test // gh-33727 + void resolveNestedPlaceHolderIfValueShouldConvertToOtherTypes() { + MutablePropertySources ps = new MutablePropertySources(); + ps.addFirst(new MockPropertySource().withProperty("new.enabled", "${old.enabled:true}")); + ConfigurablePropertyResolver pr = new PropertySourcesPropertyResolver(ps); + assertThat(pr.getProperty("new.enabled", Boolean.class, false)).isTrue(); + } + @Test void ignoreUnresolvableNestedPlaceholdersIsConfigurable() { MutablePropertySources ps = new MutablePropertySources();