springboot 全局异常处理和统一响应对象的处理方式


Posted in Java/Android onJune 28, 2022

springboot异常处理

SpringBoot 默认的异常处理机制

默认情况,SpringBoot 提供两种不同响应方式

  • 一种是浏览器客户端请求一个不存在的页面或服务端异常时,SpringBoot默认会响应一个html
  • 另一种是使用postman等调试工具请求不存在的url或服务端异常时,默认返回json信息

SpringBoot 全局异常处理

一般我们不会将错误信息返回前端,自己去try catch捕获异常,但有个问题:每个方法都这样捕获异常,肯定是不合适,这是我们就需要全局的异常处理了。

@RestController
public class ExceptionController {
    @GetMapping("exceptionA")
    public void methodA() {
        try {
            int a = 100 / 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1. 局部异常处理

使用@EceptionHandle注解实现某个类的局部异常处理

@RestController
   public class ExceptionController {
   
       @GetMapping("exceptionA")
       public void methodA() {
           int a = 100 / 0;
       }
   
       /**
        * 局部异常处理
        */
       @ExceptionHandler(Exception.class)
       public String exHandler(Exception e) {
           // 判断发生异常的类型是除0异常则做出响应
           if (e instanceof ArithmeticException) {
               return "发生了除0异常";
           }
           // 未知的异常做出响应
           return "发生了未知异常";
       }
   }

2. 全局异常处理

使用@ControllerAdvice +@ExceptionHandler注解实现全局异常处理

自定义一个异常类

@RestControllerAdvice
public class DefaultException {
​
    @ExceptionHandler({NullPointerException.class})
    public String exception(NullPointerException exception) {
        return "空指针异常";
​
    }
​
    @ExceptionHandler({IndexOutOfBoundsException.class})
    public String exception(IndexOutOfBoundsException exception) {
        return "数组越界异常";
    }
}

增加一个异常方法测试,由于局部异常优先级更高先注释掉了

@RestController
public class ExceptionController {
​
    @GetMapping("exceptionA")
    public void methodA() {
        int a = 100 / 0;
    }
​
    @GetMapping("exceptionB")
    public void methodB() {
        List list = new ArrayList<>();
        System.out.println(list.get(0));
    }
​
    /**
     * 局部异常处理
     */
    //@ExceptionHandler(Exception.class)
    //public String exHandler(Exception e) {
    //    // 判断发生异常的类型是除0异常则做出响应
    //    if (e instanceof ArithmeticException) {
    //        return "发生了除0异常";
    //    }
    //    // 未知的异常做出响应
    //    return "发生了未知异常";
    //}
}

全局异常注解已生效

自定义异常

自定义异常只需要继承exception类或其子类

@Data
@NoArgsConstructor
public class CustomException extends Exception {
​
    private static final long serialVersionUID = 1L;
​
    private Integer code;
​
    private String mes;
​
    /**
     * @param code 状态码
     * @param msg  异常返回信息
     * @description 构造器
     */
    public CustomException(Integer code, String msg) {
        super(msg);
        this.code = code;
    }
}

使用时可以直接抛出异常对象

@GetMapping("exceptionC")
public void methodC() throws CustomException {
    int a = 1;
    if (a == 1) {
        throw new CustomException(10086, "自定义异常");
    }
}

统一响应对象

实际开发中我们需要封装统一的响应对象,区分状态码和信息,以便前端处理。

定义统一的响应对象

一般包含状态码,错误信息,数据等。

自定义一些方法用来返回信息,比如我定义的success(),failed()方法

@Data
@NoArgsConstructor
@AllArgsConstructor
public class R<T> {
    /**
     * 返回状态码
     */
    private Integer code;
    /**
     * 返回信息
     */
    private String msg;
    /**
     * 数据
     */
    private T data;
​
    public static R success() {
        return new R(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), null);
    }
​
    public static R success(Object data) {
        return new R(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), data);
    }
​
    public static R failed() {
        return new R(ResultCode.FAILED.getCode(), ResultCode.FAILED.getMsg(), null);
    }
​
    public static R failed(String msg) {
        return new R(ResultCode.FAILED.getCode(), msg, null);
    }
​
    public static R failed(int code, String msg) {
        return new R(code, msg, null);
    }
}

枚举信息

枚举一些常用的状态信息

我就举个例子,只枚举2个,根据需要去自定义

@NoArgsConstructor
@AllArgsConstructor
public enum ResultCode {
​
    SUCCESS(200, "请求成功"),
    FAILED(500, "服务器错误");
​
    private int code;
    private String msg;
​
    public int getCode() {
        return code;
    }
​
    public void setCode(int code) {
        this.code = code;
    }
​
    public String getMsg() {
        return msg;
    }
​
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

响应对象

使用时直接返回定义的对象类型就行了,将定义的全局异常返回类型也改成统一的响应对象

@RestControllerAdvice
public class DefaultException {
    @ExceptionHandler({CustomException.class})
    public R exception(CustomException e) {
        return R.failed(e.getCode(),e.getMessage());
    }

    @ExceptionHandler({Exception.class})
    public R exception(Exception e) {
        return R.failed(e.getMessage());
    }
}

全局异常和响应对象的简单介绍就这样了,欢迎补充指正。

gitee地址:gitee.com/rainscloud/…

到此这篇关于springboot 全局异常处理和统一响应对象的文章就介绍到这了,更多相关springboot全局异常处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
Java新手教程之ArrayList的基本使用
Jun 20 Java/Android
Java中PriorityQueue实现最小堆和最大堆的用法
Jun 27 Java/Android
Java并发编程必备之Future机制
Jun 30 Java/Android
SpringBoot工程下使用OpenFeign的坑及解决
Jul 02 Java/Android
JUnit5常用注解的使用
Jul 02 Java/Android
Java日常练习题,每天进步一点点(38)
Jul 26 Java/Android
Java后台生成图片的完整步骤
Aug 04 Java/Android
maven依赖的version声明控制方式
Jan 18 Java/Android
springboot 自定义配置 解决Boolean属性不生效
Mar 18 Java/Android
Jmerte 分布式压测及分布式压测配置
Apr 30 Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 Java/Android
Java多线程并发FutureTask使用详解
Jun 28 Java/Android
详解Spring Security如何在权限中使用通配符
Jun 28 #Java/Android
Android RecyclerView实现九宫格效果
Jun 28 #Java/Android
Java 多线程并发FutureTask
Java+swing实现抖音上的表白程序详解
Jun 25 #Java/Android
Java Spring Boot请求方式与请求映射过程分析
Jun 25 #Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 #Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 #Java/Android
You might like
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
jQuery的基本概念与高级编程
2015/05/14 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
python实现dict版图遍历示例
2014/02/19 Python
python处理文本文件并生成指定格式的文件
2014/07/31 Python
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
利用python发送和接收邮件
2016/09/27 Python
python交易记录链的实现过程详解
2019/07/03 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
编写python代码实现简单抽奖器
2020/10/20 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
Python操作Excel的学习笔记
2021/02/18 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
美国最好的葡萄酒网上商店:Wine Library
2019/11/02 全球购物
乐高瑞士官方商店:LEGO CH
2020/08/16 全球购物
计算机应用毕业生自荐信
2013/10/23 职场文书
中学生团员自我评价分享
2013/12/07 职场文书
优秀学生事迹材料
2014/02/08 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
婚礼父母致辞
2015/07/28 职场文书
国家助学金受助感言
2015/08/01 职场文书