Bean验证引发ConstraintViolationException时自定义JAX-RS响应

时间:2017-06-01 12:53:26

标签: java rest jax-rs resteasy bean-validation

Bean 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文档中规范化这些错误。

如何自定义此行为?

1 个答案:

答案 0 :(得分:10)

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

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

@Provider
public class ConstraintViolationExceptionMapper 
       implements ExceptionMapper<ConstraintViolationException> {

    @Override
    public Response toResponse(ConstraintViolationException exception) {

        List<ValidationError> 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解析,您可能需要查看此answer,了解如何获取实际JSON属性的值。