0
点赞
收藏
分享

微信扫一扫

SpringBoot 捕捉验证异常并优雅的返回

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
br/>@AllArgsConstructor
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);
}
}

举报

相关推荐

0 条评论