zoukankan      html  css  js  c++  java
  • SpringBoot全局异常拦截

    SpringBoot全局异常捕获
    使用到的技能
    @RestControllerAdvice或(@ControllerAdvice+@ResponseBody)
    @ExceptionHandler
    代码实现
    统一返回入口
    自定义异常
    全局异常处理
    统一返回入口Result
    /**

    • @ClassName Result

    • @Description 统一返回格式

    • @Author chaoba

    • @Version V1.0
      */
      @Data
      public class Result {
      private int code;
      private String msg;
      private T data;

      /**

      • 成功时候的调用
        */
        public static Result success(T data) {
        Result result = new Result(CodeMsg.SUCCESS);
        result.setData(data);
        return result;
        }

      /**

      • 成功时候的调用
        */
        public static Result successMsg(String msg) {
        return new Result(200, msg);
        }

      /**

      • 失败时候的调用
        */
        public static Result errorCodeMsg(CodeMsg codeMsg) {
        return new Result(codeMsg);
        }

      /**

      • 成功时候的调用
        */
        public static Result successCodeMsg(CodeMsg codeMsg) {
        return new Result(codeMsg);
        }

      public static Result error(T data) {
      Result result = new Result(CodeMsg.FAIL);
      result.setData(data);
      return result;
      }

      /**

      • 失败时候的调用
        */
        public static Result errorMsg(String msg) {
        return new Result(0, msg);
        }

      /**

      • 全部参数
      • @param
      • @param
      • @return
        */
        public static Result getResult() {
        return new Result();
        }

      public static Result toAjaxResult(int rows) {
      return rows > 0 ? success(null) : error(null);
      }

      public static Result toAjaxResult(boolean rows) {
      return rows ? success(null) : error(null);
      }

      private Result(T data) {
      this.data = data;
      }

      private Result() {
      }

      private Result(int code, String msg) {
      this.code = code;
      this.msg = msg;
      }

      private Result(CodeMsg codeMsg) {
      if (codeMsg != null) {
      this.code = codeMsg.getCode();
      this.msg = codeMsg.getMsg();
      }
      }

    }

    自定义异常
    /**

    • @ClassName GlabalException

    • @Description 全局异常

    • @Author chaoba

    • @Version V1.0
      */
      @Data
      public class GlabalException extends RuntimeException {
      //错误状态码
      private int code;

      public GlabalException(int code) {
      this.code = code;
      }

      public GlabalException(String message, int code) {
      super(message);
      this.code = code;
      }

      public GlabalException(CodeMsg codeMsg) {
      super(codeMsg.getMsg());
      this.code = codeMsg.getCode();
      }

      public GlabalException(String message) {
      super(message);
      }

      public GlabalException(Throwable cause, int code) {
      super(cause);
      this.code = code;
      }

      public GlabalException(GlabalException ex) {
      super(ex);

      }
      }
      全局异常处理
      /**

    • @ClassName GlabalExceptionHandler

    • @Description 全局异常拦截,只提供接口-无需页面404等错误

    • @Author chaoba

    • @Version V1.0
      */
      @RestControllerAdvice
      public class GlabalExceptionHandler {
      //拦截自定义异常
      @ExceptionHandler(value = GlabalException.class)
      public Result jsonErrorHandler(GlabalException e) {
      Result result = Result.getResult();
      result.setMsg(e.getMessage());
      result.setCode(e.getCode());
      result.setData(null);
      return result;
      }
      //拦截全部异常
      @ExceptionHandler(value = Exception.class)
      public Result systemJsonErrorHandler(Exception e) {
      e.printStackTrace();
      if (e instanceof NoHandlerFoundException) {
      return Result.errorCodeMsg(CodeMsg.NOT_FOUND);
      } else if (e instanceof MissingServletRequestParameterException) {
      //get请求参数异常,不能为空异常---Query中缺少必要的参数。
      Result objectResult = Result.errorCodeMsg(CodeMsg.METHOD_ARG_TYPE_EXCEPTION);
      objectResult.setMsg("参数 " + ((MissingServletRequestParameterException) e).getParameterName() + "不能为空");
      return objectResult;

       } else if (e instanceof MethodArgumentNotValidException) {
           //参数校验
           MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;
           FieldError fieldError = ex.getBindingResult().getFieldErrors().get(0);
           Result<Object> objectResult = Result.errorCodeMsg(CodeMsg.METHOD_ARG_TYPE_EXCEPTION);
           objectResult.setMsg(fieldError.getField() + "  " + fieldError.getDefaultMessage());
           return objectResult;
       } else if (e instanceof MethodArgumentTypeMismatchException) {
           // @RequestParam  参数类型错误
           Result<Object> objectResult = Result.errorCodeMsg(CodeMsg.METHOD_ARG_TYPE_EXCEPTION);
           MethodArgumentTypeMismatchException ex = (MethodArgumentTypeMismatchException) e;
           if (ex.getName() != null && !ex.getName().isEmpty()) {
               objectResult.setMsg("参数 " + ex.getName() + " 类型错误");
           }
           return objectResult;
      
       } else if (e instanceof HttpMessageNotReadableException) {
           //传参类型导致请求参数异常---content_type导致的异常
           return Result.errorCodeMsg(CodeMsg.METHOD_ARG_TYPE_EXCEPTION);
       } else if (e instanceof HttpRequestMethodNotSupportedException) {
           //客户端使用的请求方法不被该接口支持。请求方式错了
           return Result.errorCodeMsg(CodeMsg.HTTP_REQUEST_METHOD_NOT_SUPPORTED);
       } else if (e instanceof DuplicateKeyException) {
           return Result.errorCodeMsg(CodeMsg.EXIST);
       } else if (e instanceof MySQLIntegrityConstraintViolationException) {
           return Result.errorCodeMsg(CodeMsg.EXIST);
       }
      
       return Result.errorCodeMsg(CodeMsg.SERVER_EXCEPTION);
      

      }

    }

    本文作者: 暮雪超霸

    本文链接:https://www.cnblogs.com/chaoba/p/14204069.html

  • 相关阅读:
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    架构漫谈读后感
    软件体系架构课下作业01
    架构之美阅读笔记06
    架构之美阅读笔记05
    架构之美阅读笔记04
    架构之美阅读笔记03
    架构之美阅读笔记02
    架构之美阅读笔记01
    学习进度15
  • 原文地址:https://www.cnblogs.com/wwyydd/p/14207216.html
Copyright © 2011-2022 走看看