Unwrap SpringValidatorAdapter (e.g. CustomValidatorBean) to native Validator
Issue: SPR-15629
This commit is contained in:
parent
9cb9884533
commit
8330134757
|
@ -85,9 +85,13 @@ public class MethodValidationPostProcessor extends AbstractBeanFactoryAwareAdvis
|
||||||
* <p>Default is the default ValidatorFactory's default Validator.
|
* <p>Default is the default ValidatorFactory's default Validator.
|
||||||
*/
|
*/
|
||||||
public void setValidator(Validator validator) {
|
public void setValidator(Validator validator) {
|
||||||
|
// Unwrap to the native Validator with forExecutables support
|
||||||
if (validator instanceof LocalValidatorFactoryBean) {
|
if (validator instanceof LocalValidatorFactoryBean) {
|
||||||
this.validator = ((LocalValidatorFactoryBean) validator).getValidator();
|
this.validator = ((LocalValidatorFactoryBean) validator).getValidator();
|
||||||
}
|
}
|
||||||
|
else if (validator instanceof SpringValidatorAdapter) {
|
||||||
|
this.validator = validator.unwrap(Validator.class);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
this.validator = validator;
|
this.validator = validator;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,8 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import javax.validation.ConstraintViolation;
|
import javax.validation.ConstraintViolation;
|
||||||
|
import javax.validation.ValidationException;
|
||||||
|
import javax.validation.Validator;
|
||||||
import javax.validation.metadata.BeanDescriptor;
|
import javax.validation.metadata.BeanDescriptor;
|
||||||
import javax.validation.metadata.ConstraintDescriptor;
|
import javax.validation.metadata.ConstraintDescriptor;
|
||||||
|
|
||||||
|
@ -39,13 +41,19 @@ import org.springframework.validation.ObjectError;
|
||||||
import org.springframework.validation.SmartValidator;
|
import org.springframework.validation.SmartValidator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adapter that takes a JSR-303 {@code javax.validator.Validator}
|
* Adapter that takes a JSR-303 {@code javax.validator.Validator} and
|
||||||
* and exposes it as a Spring {@link org.springframework.validation.Validator}
|
* exposes it as a Spring {@link org.springframework.validation.Validator}
|
||||||
* while also exposing the original JSR-303 Validator interface itself.
|
* while also exposing the original JSR-303 Validator interface itself.
|
||||||
*
|
*
|
||||||
* <p>Can be used as a programmatic wrapper. Also serves as base class for
|
* <p>Can be used as a programmatic wrapper. Also serves as base class for
|
||||||
* {@link CustomValidatorBean} and {@link LocalValidatorFactoryBean}.
|
* {@link CustomValidatorBean} and {@link LocalValidatorFactoryBean}.
|
||||||
*
|
*
|
||||||
|
* <p>Note that Bean Validation 1.1's {@code #forExecutables} method isn't supported
|
||||||
|
* on this adapter: We do not expect that method to be called by application code;
|
||||||
|
* consider {@link MethodValidationInterceptor} instead. If you really need programmatic
|
||||||
|
* {@code #forExecutables} access, call {@code #unwrap(Validator.class) which will
|
||||||
|
* provide the native {@link Validator} object with {@code #forExecutables} support.
|
||||||
|
*
|
||||||
* @author Juergen Hoeller
|
* @author Juergen Hoeller
|
||||||
* @since 3.0
|
* @since 3.0
|
||||||
*/
|
*/
|
||||||
|
@ -297,7 +305,16 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation.
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public <T> T unwrap(Class<T> type) {
|
public <T> T unwrap(Class<T> type) {
|
||||||
Assert.state(this.targetValidator != null, "No target Validator set");
|
Assert.state(this.targetValidator != null, "No target Validator set");
|
||||||
return (type != null ? this.targetValidator.unwrap(type) : (T) this.targetValidator);
|
try {
|
||||||
|
return (type != null ? this.targetValidator.unwrap(type) : (T) this.targetValidator);
|
||||||
|
}
|
||||||
|
catch (ValidationException ex) {
|
||||||
|
// ignore if just being asked for plain Validator
|
||||||
|
if (Validator.class == type) {
|
||||||
|
return (T) this.targetValidator;
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue