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属性的值。
- JSR303自定义validation器被调用两次
- 更新(合并)时缺少Spring Data JPAvalidation
- Spring Boot JSR-303/349配置
- BigDecimal的JPA @Size注释
- ValidationMessages.properties文件之间的冲突
- Hibernate – 激活Bean Validation集成时出错
- 与Bean Validation API结合使用时,Hibernate不遵循JPA规范吗?
- javax.validation.ValidationException:无法找到默认提供程序
- JSF:如何validation字段并通过beanvalidation返回错误消息?