|
|
|
@ -165,27 +165,15 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation. |
|
|
|
String nestedField = bindingResult.getNestedPath() + field; |
|
|
|
String nestedField = bindingResult.getNestedPath() + field; |
|
|
|
if (nestedField.isEmpty()) { |
|
|
|
if (nestedField.isEmpty()) { |
|
|
|
String[] errorCodes = bindingResult.resolveMessageCodes(errorCode); |
|
|
|
String[] errorCodes = bindingResult.resolveMessageCodes(errorCode); |
|
|
|
ObjectError error = new ObjectError( |
|
|
|
ObjectError error = new ViolationObjectError( |
|
|
|
errors.getObjectName(), errorCodes, errorArgs, violation.getMessage()) { |
|
|
|
errors.getObjectName(), errorCodes, errorArgs, violation, this); |
|
|
|
@Override |
|
|
|
|
|
|
|
public boolean shouldRenderDefaultMessage() { |
|
|
|
|
|
|
|
return requiresMessageFormat(violation); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
error.wrap(violation); |
|
|
|
|
|
|
|
bindingResult.addError(error); |
|
|
|
bindingResult.addError(error); |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
Object rejectedValue = getRejectedValue(field, violation, bindingResult); |
|
|
|
Object rejectedValue = getRejectedValue(field, violation, bindingResult); |
|
|
|
String[] errorCodes = bindingResult.resolveMessageCodes(errorCode, field); |
|
|
|
String[] errorCodes = bindingResult.resolveMessageCodes(errorCode, field); |
|
|
|
FieldError error = new FieldError(errors.getObjectName(), nestedField, |
|
|
|
FieldError error = new ViolationFieldError(errors.getObjectName(), nestedField, |
|
|
|
rejectedValue, false, errorCodes, errorArgs, violation.getMessage()) { |
|
|
|
rejectedValue, errorCodes, errorArgs, violation, this); |
|
|
|
@Override |
|
|
|
|
|
|
|
public boolean shouldRenderDefaultMessage() { |
|
|
|
|
|
|
|
return requiresMessageFormat(violation); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
error.wrap(violation); |
|
|
|
|
|
|
|
bindingResult.addError(error); |
|
|
|
bindingResult.addError(error); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -307,29 +295,6 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation. |
|
|
|
return new DefaultMessageSourceResolvable(codes, field); |
|
|
|
return new DefaultMessageSourceResolvable(codes, field); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Indicate whether this violation's interpolated message has remaining |
|
|
|
|
|
|
|
* placeholders and therefore requires {@link java.text.MessageFormat} |
|
|
|
|
|
|
|
* to be applied to it. Called for a Bean Validation defined message |
|
|
|
|
|
|
|
* (coming out {@code ValidationMessages.properties}) when rendered |
|
|
|
|
|
|
|
* as the default message in Spring's MessageSource. |
|
|
|
|
|
|
|
* <p>The default implementation considers a Spring-style "{0}" placeholder |
|
|
|
|
|
|
|
* for the field name as an indication for {@link java.text.MessageFormat}. |
|
|
|
|
|
|
|
* Any other placeholder or escape syntax occurrences are typically a |
|
|
|
|
|
|
|
* mismatch, coming out of regex pattern values or the like. Note that |
|
|
|
|
|
|
|
* standard Bean Validation does not support "{0}" style placeholders at all; |
|
|
|
|
|
|
|
* this is a feature typically used in Spring MessageSource resource bundles. |
|
|
|
|
|
|
|
* @param violation the Bean Validation constraint violation, including |
|
|
|
|
|
|
|
* BV-defined interpolation of named attribute references in its message |
|
|
|
|
|
|
|
* @return {@code true} if {@code java.text.MessageFormat} is to be applied, |
|
|
|
|
|
|
|
* or {@code false} if the violation's message should be used as-is |
|
|
|
|
|
|
|
* @since 5.1.8 |
|
|
|
|
|
|
|
* @see #getArgumentsForConstraint |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected boolean requiresMessageFormat(ConstraintViolation<?> violation) { |
|
|
|
|
|
|
|
return violation.getMessage().contains("{0}"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Extract the rejected value behind the given constraint violation, |
|
|
|
* Extract the rejected value behind the given constraint violation, |
|
|
|
* for exposure through the Spring errors representation. |
|
|
|
* for exposure through the Spring errors representation. |
|
|
|
@ -354,6 +319,33 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation. |
|
|
|
return invalidValue; |
|
|
|
return invalidValue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Indicate whether this violation's interpolated message has remaining |
|
|
|
|
|
|
|
* placeholders and therefore requires {@link java.text.MessageFormat} |
|
|
|
|
|
|
|
* to be applied to it. Called for a Bean Validation defined message |
|
|
|
|
|
|
|
* (coming out {@code ValidationMessages.properties}) when rendered |
|
|
|
|
|
|
|
* as the default message in Spring's MessageSource. |
|
|
|
|
|
|
|
* <p>The default implementation considers a Spring-style "{0}" placeholder |
|
|
|
|
|
|
|
* for the field name as an indication for {@link java.text.MessageFormat}. |
|
|
|
|
|
|
|
* Any other placeholder or escape syntax occurrences are typically a |
|
|
|
|
|
|
|
* mismatch, coming out of regex pattern values or the like. Note that |
|
|
|
|
|
|
|
* standard Bean Validation does not support "{0}" style placeholders at all; |
|
|
|
|
|
|
|
* this is a feature typically used in Spring MessageSource resource bundles. |
|
|
|
|
|
|
|
* @param violation the Bean Validation constraint violation, including |
|
|
|
|
|
|
|
* BV-defined interpolation of named attribute references in its message |
|
|
|
|
|
|
|
* @return {@code true} if {@code java.text.MessageFormat} is to be applied, |
|
|
|
|
|
|
|
* or {@code false} if the violation's message should be used as-is |
|
|
|
|
|
|
|
* @since 5.1.8 |
|
|
|
|
|
|
|
* @see #getArgumentsForConstraint |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected boolean requiresMessageFormat(ConstraintViolation<?> violation) { |
|
|
|
|
|
|
|
return containsSpringStylePlaceholder(violation.getMessage()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static boolean containsSpringStylePlaceholder(@Nullable String message) { |
|
|
|
|
|
|
|
return (message != null && message.contains("{0}")); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------
|
|
|
|
//---------------------------------------------------------------------
|
|
|
|
// Implementation of JSR-303 Validator interface
|
|
|
|
// Implementation of JSR-303 Validator interface
|
|
|
|
@ -436,6 +428,71 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation. |
|
|
|
public String getDefaultMessage() { |
|
|
|
public String getDefaultMessage() { |
|
|
|
return this.resolvableString; |
|
|
|
return this.resolvableString; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public String toString() { |
|
|
|
|
|
|
|
return this.resolvableString; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Subclass of {@code ObjectError} with Spring-style default message rendering. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@SuppressWarnings("serial") |
|
|
|
|
|
|
|
private static class ViolationObjectError extends ObjectError implements Serializable { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
|
|
|
|
private transient SpringValidatorAdapter adapter; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
|
|
|
|
private transient ConstraintViolation<?> violation; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public ViolationObjectError(String objectName, String[] codes, Object[] arguments, |
|
|
|
|
|
|
|
ConstraintViolation<?> violation, SpringValidatorAdapter adapter) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
super(objectName, codes, arguments, violation.getMessage()); |
|
|
|
|
|
|
|
this.adapter = adapter; |
|
|
|
|
|
|
|
this.violation = violation; |
|
|
|
|
|
|
|
wrap(violation); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public boolean shouldRenderDefaultMessage() { |
|
|
|
|
|
|
|
return (this.adapter != null && this.violation != null ? |
|
|
|
|
|
|
|
this.adapter.requiresMessageFormat(this.violation) : |
|
|
|
|
|
|
|
containsSpringStylePlaceholder(getDefaultMessage())); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Subclass of {@code FieldError} with Spring-style default message rendering. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
@SuppressWarnings("serial") |
|
|
|
|
|
|
|
private static class ViolationFieldError extends FieldError implements Serializable { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
|
|
|
|
private transient SpringValidatorAdapter adapter; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
|
|
|
|
private transient ConstraintViolation<?> violation; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public ViolationFieldError(String objectName, String field, @Nullable Object rejectedValue, String[] codes, |
|
|
|
|
|
|
|
Object[] arguments, ConstraintViolation<?> violation, SpringValidatorAdapter adapter) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
super(objectName, field, rejectedValue, false, codes, arguments, violation.getMessage()); |
|
|
|
|
|
|
|
this.adapter = adapter; |
|
|
|
|
|
|
|
this.violation = violation; |
|
|
|
|
|
|
|
wrap(violation); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public boolean shouldRenderDefaultMessage() { |
|
|
|
|
|
|
|
return (this.adapter != null && this.violation != null ? |
|
|
|
|
|
|
|
this.adapter.requiresMessageFormat(this.violation) : |
|
|
|
|
|
|
|
containsSpringStylePlaceholder(getDefaultMessage())); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|