SpringBoot使用validation验证接口数据时 返回的信息不好阅读 所以使用@RestControllerAdice来捕捉异常并处理返回

上代码:

/**
 * @Author: yipeng.liu
 * @Date: 2021/11/3 18:05
 * @Description: adviceException 捕捉异常 接口返回
 */
@Log4j2
@RestControllerAdvice
public class adviceException {

    @ExceptionHandler({
    BindException.class, // 绑定异常
    MethodArgumentNotValidException.class, // 参数无效异常
    ConstraintViolationException.class // 违反约束异常
  })
  public WebResp<String> handleAdviceException(Exception e) {
    String errorMsg = "参数验证错误";
    BindingResult bindingResult = null;
    // instanceof 检查一个对象是否为一个类的实例
    if (e instanceof BindException) {
      BindException bindException = (BindException) e;
      bindingResult = bindException.getBindingResult();
    }
    if (e instanceof MethodArgumentNotValidException) {
      MethodArgumentNotValidException methodArgumentNotValidException =
          (MethodArgumentNotValidException) e;
      bindingResult = methodArgumentNotValidException.getBindingResult();
    }
    if (e instanceof ConstraintViolationException) {
      ConstraintViolationException constraintViolationException = (ConstraintViolationException) e;
      errorMsg = constraintViolationException.getMessage();
    }
    if (bindingResult != null) {
      for (FieldError filedError : bindingResult.getFieldErrors()) {
        errorMsg = filedError.getDefaultMessage();
      }
    }
    return WebResp.error(500, errorMsg);
  }
}

注解解释:

  1. 主要就是用 @RestControllerAdvice + @ExceptionHandler来捕获处理异常信息 理解:@RestControllerAdvice 是对Controller进行增强的,可以全局捕获spring mvc抛的异常 @RestControllerAdvice 与 @ControllerAdvice 区别就是 RestControllerAdvice 会将方法返回的信息序列化 返回,不会调用视图解析跳转页面,ControllerAdvice反之
  2. 重点使用以下异常类 都是 validation 包里的 BindException.class, //绑定异常 MethodArgumentNotValidException.class, // 参数无效异常 ConstraintViolationException.class // 违反约束异常
  3. 返回的 WebResp是我自定义的 返回类 WebResp.class:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class WebResp<T> {
  private Object code;
  private String message;
  private T data;

  public static <T> WebResp<T> success(T data) {
    return new WebResp<>(0, "success", data);
  }

  public static <T> WebResp<T> error(Object code, String message) {
    return new WebResp<>(code, message, null);
  }
}