This looks like a good case to apply some AOP. One way is to create a @Before
aspect that inspects the called arguments to see if they are annotated with @Valid
, and if so trigger the validation for that argument and treat the results.
The code of this aspect would look like this:
@Aspect
public class ValidatingAspect {
Validator validator;
public ValidatingAspect() {
Configuration<?> configuration = Validation.byDefaultProvider().configure();
ValidatorFactory factory = configuration.buildValidatorFactory();
this.validator = factory.getValidator();
}
@Before("execution(* com.yourpackage..*.*(..))")
public void validateBefore(JoinPoint jp) throws Throwable {
Object[] args = jp.getArgs();
MethodSignature ms = (MethodSignature) jp.getSignature();
Method m = ms.getMethod();
Annotation[][] parameterAnnotations = m.getParameterAnnotations();
for (int i = 0; i < parameterAnnotations.length; i++) {
Annotation[] annotations = parameterAnnotations[i];
for (Annotation annotation : annotations) {
if (annotation.annotationType() == Valid.class) {
Set<ConstraintViolation<T>> constraintViolations = validator.validate(jp.getArgs()[i]);
... handle validation results ...
}
}
}
}
}