diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationPostProcessor.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationPostProcessor.java index a2972a1388..e1d4eff573 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationPostProcessor.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationPostProcessor.java @@ -85,9 +85,13 @@ public class MethodValidationPostProcessor extends AbstractBeanFactoryAwareAdvis *

Default is the default ValidatorFactory's default Validator. */ public void setValidator(Validator validator) { + // Unwrap to the native Validator with forExecutables support if (validator instanceof LocalValidatorFactoryBean) { this.validator = ((LocalValidatorFactoryBean) validator).getValidator(); } + else if (validator instanceof SpringValidatorAdapter) { + this.validator = validator.unwrap(Validator.class); + } else { this.validator = validator; } diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java index a2a2125a74..692e660b1d 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringValidatorAdapter.java @@ -25,6 +25,8 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; import javax.validation.ConstraintViolation; +import javax.validation.ValidationException; +import javax.validation.Validator; import javax.validation.metadata.BeanDescriptor; import javax.validation.metadata.ConstraintDescriptor; @@ -39,13 +41,19 @@ import org.springframework.validation.ObjectError; import org.springframework.validation.SmartValidator; /** - * Adapter that takes a JSR-303 {@code javax.validator.Validator} - * and exposes it as a Spring {@link org.springframework.validation.Validator} + * Adapter that takes a JSR-303 {@code javax.validator.Validator} and + * exposes it as a Spring {@link org.springframework.validation.Validator} * while also exposing the original JSR-303 Validator interface itself. * *

Can be used as a programmatic wrapper. Also serves as base class for * {@link CustomValidatorBean} and {@link LocalValidatorFactoryBean}. * + *

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 * @since 3.0 */ @@ -297,7 +305,16 @@ public class SpringValidatorAdapter implements SmartValidator, javax.validation. @SuppressWarnings("unchecked") public T unwrap(Class type) { 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; + } }