首页 > 解决方案 > 如何记录 SpringBoot 请求验证错误?

问题描述

如何在springboot中记录请求验证错误?比如说,我们有一个如下所示的 API,如果其中一个请求参数中存在验证错误,我需要记录吗?

@GetMapping(value = "/hello", produces = MediaType.APPLICATION_JSON_VALUE)
    public String sayHi(@RequestParam(name = "size") @Max(30) Integer size) {
      return "Hi" + size.toString();
}

如果大小值大于 30,则 API 返回验证错误。但是,除此之外,我还在寻找一种记录此类无效请求的方法

标签: javaspring-bootlogging

解决方案


由于您使用的是 springboot,您可以使用 spring boot 集中异常处理@ControllerAdvice来记录这些错误或返回自定义的公共响应类。注释将@ControllerAdvice使其全局应用于所有控制器。为了捕获请求主体的验证错误,我们将处理MethodArgumentNotValidExceptions如下:

@ControllerAdvice
class ErrorHandlingControllerAdvice {

  private static final Logger LOGGER = LoggerFactory.getLogger(ErrorHandlingControllerAdvice.class);
  @ExceptionHandler(ConstraintViolationException.class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  @ResponseBody
  ApiErrorResponse onConstraintValidationException(
      ConstraintViolationException e) {
    ApiErrorResponse apiErrorResponse = new ApiErrorResponse();
    for (ConstraintViolation violation : e.getConstraintViolations()) {
      apiErrorResponse.getViolations().add(
        new Violation(violation.getPropertyPath().toString(), violation.getMessage()));
    }
    return apiErrorResponse;
  }

  @ExceptionHandler(MethodArgumentNotValidException.class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  @ResponseBody
  ApiErrorResponse onMethodArgumentNotValidException(
      MethodArgumentNotValidException e) {
    ApiErrorResponse error = new ApiErrorResponse();
    for (FieldError fieldError : e.getBindingResult().getFieldErrors()) {
      error.getViolations().add(
        new Violation(fieldError.getField(), fieldError.getDefaultMessage()));
    }
    LOGGER.error("Log whatever you want to here");
    return error;
  }

}

推荐阅读