ConstraintViolationException 的不同响应状态代码

Different response status codes for ConstraintViolationException

所以。在我的 spring 应用程序中,在服务中我验证了一些对象,如果它无效,则抛出 ConstraintViolationException

Set<ConstraintViolation<ImageRequest>> violations = validator.validate(imageRequest);
    if (!violations.isEmpty()) {
        throw new ConstraintViolationException(violations);
    }

在@ControllerAdvice 中它由

处理
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
ValidationErrorResponse onConstraintValidationException(
        ConstraintViolationException e) {
    ValidationErrorResponse error = new ValidationErrorResponse();
    for (ConstraintViolation violation : e.getConstraintViolations()) {
        error.getErrors().put(
                violation.getPropertyPath().toString(), violation.getMessage());
    }
    return error;
}

问题是有时我需要 return 不同的 ConstraintViolationException 响应状态代码(这取决于生成 ConstraintViolationException 的对象类型)。我怎样才能实现它? P.S。对不起英语

  1. 移除@ResponseStatus(HttpStatus.OK)

  2. 方法 A

@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
ValidationErrorResponse onConstraintValidationException(
        ConstraintViolationException e, HttpServletResponse response) {
    ValidationErrorResponse error = new ValidationErrorResponse();
    for (ConstraintViolation violation : e.getConstraintViolations()) {
        error.getErrors().put(
                violation.getPropertyPath().toString(), violation.getMessage());
    }
    response.setStatus(..based on some condition set status code ..);
    return error;
}
  1. 方法 B(恕我直言:好多了)
@ExceptionHandler(ConstraintViolationException.class)
ResponseEntity<ValidationErrorResponse> onConstraintValidationException(
        ConstraintViolationException e) {
    ValidationErrorResponse error = new ValidationErrorResponse();
    for (ConstraintViolation violation : e.getConstraintViolations()) {
        error.getErrors().put(
                violation.getPropertyPath().toString(), violation.getMessage());
    }
    return ResponseEntity.status(..desired status..).body(error);
}