From 69124f9392dc0692191c9200230ada76531b5ef5 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 1 Dec 2009 02:25:48 +0000 Subject: [PATCH] JSR-303 SpringValidatorAdapter uses field name as first argument (analogous to bind errors; SPR-6407) --- .../DefaultBindingErrorProcessor.java | 7 ++--- .../SpringValidatorAdapter.java | 27 ++++++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/org.springframework.context/src/main/java/org/springframework/validation/DefaultBindingErrorProcessor.java b/org.springframework.context/src/main/java/org/springframework/validation/DefaultBindingErrorProcessor.java index ce6f88989c1..eaab86b9ab1 100644 --- a/org.springframework.context/src/main/java/org/springframework/validation/DefaultBindingErrorProcessor.java +++ b/org.springframework.context/src/main/java/org/springframework/validation/DefaultBindingErrorProcessor.java @@ -78,9 +78,10 @@ public class DefaultBindingErrorProcessor implements BindingErrorProcessor { /** * Return FieldError arguments for a binding error on the given field. - * Invoked for each missing required fields and each type mismatch. - *

Default implementation returns a DefaultMessageSourceResolvable - * with "objectName.field" and "field" as codes. + * Invoked for each missing required field and each type mismatch. + *

The default implementation returns a single argument of type + * DefaultMessageSourceResolvable, with "objectName.field" and "field" as codes. + * @param objectName the name of the target object * @param field the field that caused the binding error * @return the Object array that represents the FieldError arguments * @see org.springframework.validation.FieldError#getArguments diff --git a/org.springframework.context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java b/org.springframework.context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java index 43fa046ee57..d6a28c36365 100644 --- a/org.springframework.context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java +++ b/org.springframework.context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java @@ -16,10 +16,14 @@ package org.springframework.validation.beanvalidation; +import java.util.LinkedList; +import java.util.List; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.metadata.BeanDescriptor; +import javax.validation.metadata.ConstraintDescriptor; +import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.util.Assert; import org.springframework.validation.Errors; import org.springframework.validation.FieldError; @@ -74,12 +78,33 @@ public class SpringValidatorAdapter implements Validator, javax.validation.Valid if (fieldError == null || !fieldError.isBindingFailure()) { errors.rejectValue(field, violation.getConstraintDescriptor().getAnnotation().annotationType().getSimpleName(), - violation.getConstraintDescriptor().getAttributes().values().toArray(), + getArgumentsForConstraint(errors.getObjectName(), field, violation.getConstraintDescriptor()), violation.getMessage()); } } } + /** + * Return FieldError arguments for a validation error on the given field. + * Invoked for each violated constraint. + *

The default implementation returns a single argument of type + * DefaultMessageSourceResolvable, with "objectName.field" and "field" as codes. + * @param objectName the name of the target object + * @param field the field that caused the binding error + * @param descriptor the JSR-303 constraint descriptor + * @return the Object array that represents the FieldError arguments + * @see org.springframework.validation.FieldError#getArguments + * @see org.springframework.context.support.DefaultMessageSourceResolvable + * @see org.springframework.validation.DefaultBindingErrorProcessor#getArgumentsForBindError + */ + protected Object[] getArgumentsForConstraint(String objectName, String field, ConstraintDescriptor descriptor) { + List arguments = new LinkedList(); + String[] codes = new String[] {objectName + Errors.NESTED_PATH_SEPARATOR + field, field}; + arguments.add(new DefaultMessageSourceResolvable(codes, field)); + arguments.addAll(descriptor.getAttributes().values()); + return arguments.toArray(new Object[arguments.size()]); + } + //--------------------------------------------------------------------- // Implementation of JSR-303 Validator interface