我設法通過添加EJB攔截器來執行wink的bean驗證。在這裏,我用OpenJPA的驗證作爲一個供應商:
@Interceptor
public class ValidationInterceptor {
Validator validator = Validation.byProvider(ApacheValidationProvider.class).configure().buildValidatorFactory().getValidator();
@AroundInvoke
public Object validate(InvocationContext ctx) throws Exception {
Object[] parameters = ctx.getParameters();
Set<ConstraintViolation<Object>> validateResult = new HashSet<>();
for (Object parameter : parameters) {
Set<ConstraintViolation<Object>> validateParam = validator.validate(parameter);
validateResult.addAll(validateParam);
}
if (!validateResult.isEmpty()) {
throw new RestValidationException(validateResult);
}
return ctx.proceed();
}
}
自定義異常是相當輸出:
public class RestValidationException extends WebApplicationException {
List<String> validationErrors = new ArrayList<String>();
public RestValidationException(Set<? extends ConstraintViolation<?>> violations) {
for(ConstraintViolation<?> constraintViolation : violations) {
String error = constraintViolation.getPropertyPath().toString() + ": " + constraintViolation.getMessage();
validationErrors.add(error);
}
}
@Override
public Response getResponse() {
return Response.status(Status.BAD_REQUEST).type(MediaType.APPLICATION_JSON_TYPE).entity(validationErrors).build();
}
}
現在你有@Interceptors(ValidationInterceptor.class)和所有的參數都標註您的REST資源在進入方法之前進行驗證。 如果你不使用EJB,你可以用cglib的MethodInterceptor攔截它(Spring可以在這裏獲得幫助)。