@ -165,27 +165,15 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
@@ -165,27 +165,15 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
String nestedField = bindingResult . getNestedPath ( ) + field ;
if ( nestedField . isEmpty ( ) ) {
String [ ] errorCodes = bindingResult . resolveMessageCodes ( errorCode ) ;
ObjectError error = new ObjectError (
errors . getObjectName ( ) , errorCodes , errorArgs , violation . getMessage ( ) ) {
@Override
public boolean shouldRenderDefaultMessage ( ) {
return requiresMessageFormat ( violation ) ;
}
} ;
error . wrap ( violation ) ;
ObjectError error = new ViolationObjectError (
errors . getObjectName ( ) , errorCodes , errorArgs , violation , this ) ;
bindingResult . addError ( error ) ;
}
else {
Object rejectedValue = getRejectedValue ( field , violation , bindingResult ) ;
String [ ] errorCodes = bindingResult . resolveMessageCodes ( errorCode , field ) ;
FieldError error = new FieldError ( errors . getObjectName ( ) , nestedField ,
rejectedValue , false , errorCodes , errorArgs , violation . getMessage ( ) ) {
@Override
public boolean shouldRenderDefaultMessage ( ) {
return requiresMessageFormat ( violation ) ;
}
} ;
error . wrap ( violation ) ;
FieldError error = new ViolationFieldError ( errors . getObjectName ( ) , nestedField ,
rejectedValue , errorCodes , errorArgs , violation , this ) ;
bindingResult . addError ( error ) ;
}
}
@ -307,29 +295,6 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
@@ -307,29 +295,6 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
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 ,
* for exposure through the Spring errors representation .
@ -354,6 +319,33 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
@@ -354,6 +319,33 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
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
@ -436,6 +428,71 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
@@ -436,6 +428,71 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
public String getDefaultMessage ( ) {
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 ( ) ) ) ;
}
}
}