Beanvalidation引发ConstraintViolationException时自定义JAX-RS响应

Bean Validation是validation对象的一个​​很好的选择,但是当抛出ConstraintViolationException时如何自定义REST API的响应(使用RESTeasy)?

例如:

 @POST @Path("company") @Consumes("application/json") public void saveCompany(@Valid Company company) { ... } 

包含无效数据的请求将返回具有以下正文的HTTP 400状态代码:

 [PARAMETER] [saveCompany.arg0.name] [{company.name.size}] [a] 

这很好,但还不够,我想在JSON文档中规范化这类错误。

我该如何自定义此行为?

使用JAX-RS可以定义ExceptionMapper来处理ConstraintViolationException

ConstraintViolationException ,您可以获得一组ConstraintViolation ,它公开约束违规上下文,然后将您需要的详细信息映射到abitrary类并返回响应:

 @Provider public class ConstraintViolationExceptionMapper implements ExceptionMapper { @Override public Response toResponse(ConstraintViolationException exception) { List errors = exception.getConstraintViolations().stream() .map(this::toValidationError) .collect(Collectors.toList()); return Response.status(Response.Status.BAD_REQUEST).entity(errors) .type(MediaType.APPLICATION_JSON).build(); } private ValidationError toValidationError(ConstraintViolation constraintViolation) { ValidationError error = new ValidationError(); error.setPath(constraintViolation.getPropertyPath().toString()); error.setMessage(constraintViolation.getMessage()); return error; } } 
 public class ValidationError { private String path; private String message; // Getters and setters } 

如果您使用Jackson进行JSON解析,您可能需要查看此答案 ,显示如何获取实际JSON属性的值。