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