From 249dab6d6fb655186966dfa0136dbcf0d8256e3d Mon Sep 17 00:00:00 2001 From: Ahmed El amraouiyine Date: Fri, 19 Jun 2026 17:46:11 +0100 Subject: [PATCH] Handle unresolved validation target types See gh-50798 Signed-off-by: Ahmed El amraouiyine --- .../validation/ValidationBindHandler.java | 4 +--- .../ValidationBindHandlerTests.java | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/validation/ValidationBindHandler.java b/core/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/validation/ValidationBindHandler.java index 06e4708019c..bfd8340c041 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/validation/ValidationBindHandler.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/context/properties/bind/validation/ValidationBindHandler.java @@ -34,7 +34,6 @@ import org.springframework.boot.context.properties.source.ConfigurationProperty; import org.springframework.boot.context.properties.source.ConfigurationPropertyName; import org.springframework.boot.context.properties.source.ConfigurationPropertyName.Form; import org.springframework.core.ResolvableType; -import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.validation.AbstractBindingResult; import org.springframework.validation.BeanPropertyBindingResult; @@ -115,8 +114,7 @@ public class ValidationBindHandler extends AbstractBindHandler { if (this.exception == null) { Object validationTarget = getValidationTarget(target, context, result); Class validationType = target.getBoxedType().resolve(); - if (validationTarget != null) { - Assert.state(validationType != null, "'validationType' must not be null"); + if (validationTarget != null && validationType != null) { validateAndPush(name, validationTarget, validationType); } } diff --git a/core/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/validation/ValidationBindHandlerTests.java b/core/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/validation/ValidationBindHandlerTests.java index c9ac953d553..d8f645541e9 100644 --- a/core/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/validation/ValidationBindHandlerTests.java +++ b/core/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/validation/ValidationBindHandlerTests.java @@ -238,6 +238,15 @@ class ValidationBindHandlerTests { this.binder.bind(ConfigurationPropertyName.of("test"), Bindable.of(ExampleWithMap.class), this.handler); } + @Test + void bindShouldValidateMapWithWildcardValue() { + this.sources.add(new MockConfigurationPropertySource("test.params.toto", "titi")); + ExampleWithWildcardMap result = this.binder + .bind(ConfigurationPropertyName.of("test"), Bindable.of(ExampleWithWildcardMap.class), this.handler) + .get(); + assertThat(result.getParams().get("toto")).isEqualTo("titi"); + } + private Validator getMapValidator() { return new Validator() { @@ -425,6 +434,21 @@ class ValidationBindHandlerTests { } + @Validated + static class ExampleWithWildcardMap { + + private Map params = new LinkedHashMap<>(); + + Map getParams() { + return this.params; + } + + void setParams(Map params) { + this.params = params; + } + + } + static class ExampleMapValue { private @Nullable String number;