当 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) {
...
}
包含无效数据的请求将 return HTTP 400
状态代码,正文如下:
[PARAMETER]
[saveCompany.arg0.name]
[{company.name.size}]
[a]
这很好但还不够,我想在 JSON 文档中规范化这些类型的错误。
如何自定义此行为?
使用 JAX-RS 可以定义 ExceptionMapper
to handle ConstraintViolationException
s.
从 ConstraintViolationException
, you can get a set of ConstraintViolation
中暴露出违反约束的上下文,然后将您需要的详细信息映射到响应中的任意 class 和 return:
@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 [=30= 的值].
Bean Validation 是验证对象的一个很好的选择,但是如何在抛出 ConstraintViolationException
时自定义 REST API(使用 RESTeasy)的响应?
例如:
@POST
@Path("company")
@Consumes("application/json")
public void saveCompany(@Valid Company company) {
...
}
包含无效数据的请求将 return HTTP 400
状态代码,正文如下:
[PARAMETER]
[saveCompany.arg0.name]
[{company.name.size}]
[a]
这很好但还不够,我想在 JSON 文档中规范化这些类型的错误。
如何自定义此行为?
使用 JAX-RS 可以定义 ExceptionMapper
to handle ConstraintViolationException
s.
从 ConstraintViolationException
, you can get a set of ConstraintViolation
中暴露出违反约束的上下文,然后将您需要的详细信息映射到响应中的任意 class 和 return:
@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 [=30= 的值].