From 26284cac4f86a4e6aeead19d8676f6459f422fbb Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 1 Sep 2017 16:40:24 +0200 Subject: [PATCH] Hibernate Validator 5 compatible support for element constraints Issue: SPR-15916 Issue: SPR-15839 --- .../SpringValidatorAdapterTests.java | 49 +++++++++++++++++++ .../SpringValidatorAdapter.java | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/spring-context-support/src/test/java/org/springframework/validation/beanvalidation2/SpringValidatorAdapterTests.java b/spring-context-support/src/test/java/org/springframework/validation/beanvalidation2/SpringValidatorAdapterTests.java index 9011665a0b..b95c0a3de3 100644 --- a/spring-context-support/src/test/java/org/springframework/validation/beanvalidation2/SpringValidatorAdapterTests.java +++ b/spring-context-support/src/test/java/org/springframework/validation/beanvalidation2/SpringValidatorAdapterTests.java @@ -22,12 +22,15 @@ import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.Target; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import javax.validation.Constraint; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import javax.validation.Payload; +import javax.validation.Valid; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.constraints.NotNull; @@ -157,6 +160,35 @@ public class SpringValidatorAdapterTests { assertNull(errors.getFieldValue("property[4]")); } + @Test // SPR-15839 + public void testMapValueConstraint() { + Map property = new HashMap<>(); + property.put("no value can be", null); + + BeanWithMapEntryConstraint bean = new BeanWithMapEntryConstraint(); + bean.setProperty(property); + + BeanPropertyBindingResult errors = new BeanPropertyBindingResult(bean, "bean"); + validatorAdapter.validate(bean, errors); + + assertThat(errors.getFieldErrorCount("property[no value can be]"), is(1)); + assertNull(errors.getFieldValue("property[no value can be]")); + } + + @Test // SPR-15839 + public void testMapEntryConstraint() { + Map property = new HashMap<>(); + property.put(null, null); + + BeanWithMapEntryConstraint bean = new BeanWithMapEntryConstraint(); + bean.setProperty(property); + + BeanPropertyBindingResult errors = new BeanPropertyBindingResult(bean, "bean"); + validatorAdapter.validate(bean, errors); + + assertTrue(errors.hasFieldErrors("property[]")); + assertNull(errors.getFieldValue("property[]")); + } @Same(field = "password", comparingField = "confirmPassword") @@ -278,14 +310,31 @@ public class SpringValidatorAdapterTests { public class BeanWithListElementConstraint { + @Valid private List<@NotNull String> property; public List getProperty() { return property; } + public void setProperty(List property) { this.property = property; } } + + public class BeanWithMapEntryConstraint { + + @Valid + private Map<@NotNull String, @NotNull String> property; + + public Map getProperty() { + return property; + } + + public void setProperty(Map property) { + this.property = property; + } + } + } diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java index 3483f3f97e..d15db69471 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java @@ -194,7 +194,7 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation. sb.append(']'); } String name = node.getName(); - if (name != null && node.getKind() == ElementKind.PROPERTY) { + if (name != null && node.getKind() == ElementKind.PROPERTY && !name.startsWith("<")) { if (!first) { sb.append('.'); }