ConstraintViolationException

ConstraintViolationException

Bean验证是验证对象的一个​​不错的选择,但是当抛出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 ,它公开了违反约束的上下文,然后将所需的详细信息映射到任意类并返回响应:

@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属性的值。

09-10 16:29