繁体   English   中英

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

[英]Customizing JAX-RS response when a ConstraintViolationException is thrown by 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文档中规范化这些错误。

我该如何自定义此行为?

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

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解析,您可能需要查看此答案 ,显示如何获取实际JSON属性的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM