From 10d5926b1adc61b260bb079d08609122779aa4c2 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 29 Nov 2016 18:09:13 +0100 Subject: [PATCH] Direct use of Bean Definition 1.1 ExecutableValidator Issue: SPR-13481 --- .../MethodValidationInterceptor.java | 38 ++++--------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationInterceptor.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationInterceptor.java index 7edbacc1b5..75c76ca3dd 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationInterceptor.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationInterceptor.java @@ -23,6 +23,7 @@ import javax.validation.ConstraintViolationException; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; +import javax.validation.executable.ExecutableValidator; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; @@ -30,7 +31,6 @@ import org.aopalliance.intercept.MethodInvocation; import org.springframework.core.BridgeMethodResolver; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.util.ClassUtils; -import org.springframework.util.ReflectionUtils; import org.springframework.validation.annotation.Validated; /** @@ -58,27 +58,6 @@ import org.springframework.validation.annotation.Validated; */ public class MethodValidationInterceptor implements MethodInterceptor { - private static Method forExecutablesMethod; - - private static Method validateParametersMethod; - - private static Method validateReturnValueMethod; - - static { - try { - forExecutablesMethod = Validator.class.getMethod("forExecutables"); - Class executableValidatorClass = forExecutablesMethod.getReturnType(); - validateParametersMethod = executableValidatorClass.getMethod( - "validateParameters", Object.class, Method.class, Object[].class, Class[].class); - validateReturnValueMethod = executableValidatorClass.getMethod( - "validateReturnValue", Object.class, Method.class, Object.class, Class[].class); - } - catch (Exception ex) { - // Bean Validation 1.1 ExecutableValidator API not available - } - } - - private final Validator validator; @@ -112,21 +91,21 @@ public class MethodValidationInterceptor implements MethodInterceptor { Class[] groups = determineValidationGroups(invocation); // Standard Bean Validation 1.1 API - Object execVal = ReflectionUtils.invokeMethod(forExecutablesMethod, this.validator); + ExecutableValidator execVal = this.validator.forExecutables(); Method methodToValidate = invocation.getMethod(); - Set> result; + Set> result; try { - result = (Set>) ReflectionUtils.invokeMethod(validateParametersMethod, - execVal, invocation.getThis(), methodToValidate, invocation.getArguments(), groups); + result = execVal.validateParameters( + invocation.getThis(), methodToValidate, invocation.getArguments(), groups); } catch (IllegalArgumentException ex) { // Probably a generic type mismatch between interface and impl as reported in SPR-12237 / HV-1011 // Let's try to find the bridged method on the implementation class... methodToValidate = BridgeMethodResolver.findBridgedMethod( ClassUtils.getMostSpecificMethod(invocation.getMethod(), invocation.getThis().getClass())); - result = (Set>) ReflectionUtils.invokeMethod(validateParametersMethod, - execVal, invocation.getThis(), methodToValidate, invocation.getArguments(), groups); + result = execVal.validateParameters( + invocation.getThis(), methodToValidate, invocation.getArguments(), groups); } if (!result.isEmpty()) { throw new ConstraintViolationException(result); @@ -134,8 +113,7 @@ public class MethodValidationInterceptor implements MethodInterceptor { Object returnValue = invocation.proceed(); - result = (Set>) ReflectionUtils.invokeMethod(validateReturnValueMethod, - execVal, invocation.getThis(), methodToValidate, returnValue, groups); + result = execVal.validateReturnValue(invocation.getThis(), methodToValidate, returnValue, groups); if (!result.isEmpty()) { throw new ConstraintViolationException(result); } -- GitLab