java - 当 Bean 验证抛出 ConstraintViolationException 时自定义 JAX-RS 响应

标签 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 文档中规范化这些类型的错误。

如何自定义此行为?

最佳答案

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

关于java - 当 Bean 验证抛出 ConstraintViolationException 时自定义 JAX-RS 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44308101/

相关文章:

c# - 将表单数据发布到 MVC Core API

java - JAX-RS:是否可以有一个外部可配置的@PATH?

java - 从横向转回纵向时,为什么我的 onSaveInstanceState 无法正确保存我的 EditText 值

java - 有没有办法知道对象的类型?

java - Gradle - Java 编译忽略非 java 源文件

java - 客户端监听 JMS 队列在架构上是错误的吗?

java - Spring propertyConfigurer 不工作

Java Spring 独立 Rest 服务器 - 如何实现 SSL\HTTPS?

java - 是否有类似 javadoc 的工具可以从 JAX-RS 注释生成 RESTful Web 服务 apidoc?

google-app-engine - Google App Engine 中的 JAX-RS 服务