Skip to content

Commit 69124f9

Browse files
committed
JSR-303 SpringValidatorAdapter uses field name as first argument (analogous to bind errors; SPR-6407)
1 parent 5165465 commit 69124f9

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

org.springframework.context/src/main/java/org/springframework/validation/DefaultBindingErrorProcessor.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,10 @@ public void processPropertyAccessException(PropertyAccessException ex, BindingRe
7878

7979
/**
8080
* Return FieldError arguments for a binding error on the given field.
81-
* Invoked for each missing required fields and each type mismatch.
82-
* <p>Default implementation returns a DefaultMessageSourceResolvable
83-
* with "objectName.field" and "field" as codes.
81+
* Invoked for each missing required field and each type mismatch.
82+
* <p>The default implementation returns a single argument of type
83+
* DefaultMessageSourceResolvable, with "objectName.field" and "field" as codes.
84+
* @param objectName the name of the target object
8485
* @param field the field that caused the binding error
8586
* @return the Object array that represents the FieldError arguments
8687
* @see org.springframework.validation.FieldError#getArguments

org.springframework.context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@
1616

1717
package org.springframework.validation.beanvalidation;
1818

19+
import java.util.LinkedList;
20+
import java.util.List;
1921
import java.util.Set;
2022
import javax.validation.ConstraintViolation;
2123
import javax.validation.metadata.BeanDescriptor;
24+
import javax.validation.metadata.ConstraintDescriptor;
2225

26+
import org.springframework.context.support.DefaultMessageSourceResolvable;
2327
import org.springframework.util.Assert;
2428
import org.springframework.validation.Errors;
2529
import org.springframework.validation.FieldError;
@@ -74,12 +78,33 @@ public void validate(Object target, Errors errors) {
7478
if (fieldError == null || !fieldError.isBindingFailure()) {
7579
errors.rejectValue(field,
7680
violation.getConstraintDescriptor().getAnnotation().annotationType().getSimpleName(),
77-
violation.getConstraintDescriptor().getAttributes().values().toArray(),
81+
getArgumentsForConstraint(errors.getObjectName(), field, violation.getConstraintDescriptor()),
7882
violation.getMessage());
7983
}
8084
}
8185
}
8286

87+
/**
88+
* Return FieldError arguments for a validation error on the given field.
89+
* Invoked for each violated constraint.
90+
* <p>The default implementation returns a single argument of type
91+
* DefaultMessageSourceResolvable, with "objectName.field" and "field" as codes.
92+
* @param objectName the name of the target object
93+
* @param field the field that caused the binding error
94+
* @param descriptor the JSR-303 constraint descriptor
95+
* @return the Object array that represents the FieldError arguments
96+
* @see org.springframework.validation.FieldError#getArguments
97+
* @see org.springframework.context.support.DefaultMessageSourceResolvable
98+
* @see org.springframework.validation.DefaultBindingErrorProcessor#getArgumentsForBindError
99+
*/
100+
protected Object[] getArgumentsForConstraint(String objectName, String field, ConstraintDescriptor<?> descriptor) {
101+
List<Object> arguments = new LinkedList<Object>();
102+
String[] codes = new String[] {objectName + Errors.NESTED_PATH_SEPARATOR + field, field};
103+
arguments.add(new DefaultMessageSourceResolvable(codes, field));
104+
arguments.addAll(descriptor.getAttributes().values());
105+
return arguments.toArray(new Object[arguments.size()]);
106+
}
107+
83108

84109
//---------------------------------------------------------------------
85110
// Implementation of JSR-303 Validator interface

0 commit comments

Comments
 (0)