第二十一章:SpringBoot项目中的全局异常处理

全局异常处理不管对于API项目还是普通管理项目都是核心的部分,如果项目中遇到运行时异常,总不能每个异常处理都去添加try catch逻辑。在SpringBoot项目中跟SpringMVC的全局异常配置是一样的,下面我们来为API项目配置全局异常并且返回相同格式的JSON字符串。

本章目标

基于SpringBoot项目配置全局异常处理并且返回固定的JSON字符串。

构建项目

我们使用IntelliJ IDEA工具创建一个SpringBoot项目,事先添加依赖:Web、FastJson、Tomcat等,pom.xml配置文件内容如下图1所示:

图1

全局异常配置只需要添加一个全局的类即可,下面我们来配置全局异常Handler。

使用@ControllerAdvice

顾名思义,@ControllerAdvice注解是用来配置控制器通知的,我们可以配置过滤拦截具体一种或者多种类型的注解,添加annotations属性即可,因为我们全局返回的都是Json格式的字符串,所以需要再类上配置@ResponseBody注解,该注解熟知SpringMvc的开发人员都知道就不做过多的解释了,RestExceptionHandler全局处理类代码如下图2所示:

图2

我们在上图2内配置了运行时异常的方法处理,@ExceptionHandler注解用来配置需要拦截的异常类型,默认是全局类型。@ResponseStatus注解用于配置遇到该异常后返回数据时的StatusCode的值,我们这里默认使用值500。在类的上方我们配置了@ControllerAdvice的annotations属性值为RestController.class,也就是只有添加了@RestController注解的控制器才会进入全局异常处理,下面我们来添加一个测试控制器。

添加测试控制器

我们创建一个名叫做IndexController的控制器,代码如下图3所示:

图3

可以看到上图3内,我们的请求路径是/index/{number},这个number就是对应int number的值,我们输出20/number时,如果number = 0,那么就会出现RuntimeException。在测试代码之前我们需要添加一个固定返回Json的实体类ApiResult。

统一返回ApiResult实体

我们创建一个名叫ApiResult的实体,代码如下图4所示:

图4

这个只是一个返回对象,我们将这个类的构造函数私有化了,所以我们在外部不能直接使用new的方式创建对象,我们提供了一个newInstace方法来实例化ApiResult并获取对象。下面我们创建一个ApiResultGenerator用来生成ApiResult不同状态的返回内容(成功、失败)。

ApiResultGenerator构建者

该类是用来创建成功、失败返回JSON的工具类,普通消息方法代码如下图5所示:

图5

上图5内的方法是成功、失败共同调用的方法,成功构建ApiResult的方法如下图6所示:

图6

失败构建ApiResult的方法如下图7所示:

图7

运行测试

我们上面关于全局的异常处理已经配置完成,下面我们来运行项目测试全局异常是否生效,我们访问地址:127.0.0.1:8080/index/20,界面输出的效果如下图8所示:

图8

可以看到我们的参数number = 20时界面可以输出内容,那我们再来访问地址:127.0.0.1:8080/index/0,界面输出内容如下图9所示:

图9

上图9的内容是我们格式化ApiResult类后的Json字符串,可以看到给我们返回了错误消息以及对应的参数标识,证明我们配置的全局异常已经生效,当我们传入number = 0时,肯定会出现运行时的被除数不可以为0的异常,所以SpringBoot内置SpringMVC会通过检查是否配置全局异常来处理视图的返回内容。

总结

以上内容就是本章的全部讲解,本章主要讲解了SpringBoot项目如何配置全局异常处理,适应于普通SpringMVC项目以及SpringBoot项目。

本章内容已经上传到码云:

SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter

SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter

SpringBoot相关系列文章请访问:目录:SpringBoot学习目录

QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录

SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录

SpringBoot相关文章请访问:目录:SpringBoot学习目录,感谢阅读!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏【转载】DRF+Vue+Mysql_生鲜超市系统

Django+nginx+uwsgi部署教程(centos7+ubuntu16.4)

这里有安装方法:https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on...

22100
来自专栏黑泽君的专栏

安装最新版本的Oracle公司的虚拟机软件 VirtualBox + 安装虚拟机 Windows XP 系统 + 安装 Oracle 11g 软件 + 出现 ERROR: ORA-12541: TNS

  VirtualBox的下载链接:https://www.virtualbox.org/wiki/Downloads

28610
来自专栏Jed的技术阶梯

《Maven实战》全书总结

把MAVEN_HOME/conf/seettings.xml cp 到 ~/.m2/下,在.m2下的settings.xml中所作的配置就是用户级别的配置,而直...

49210
来自专栏向治洪

在Windows下搭建React Native Android开发环境

安装JDK 从Java官网下载JDK并安装。请注意选择x86还是x64版本。 推荐将JDK的bin目录加入系统PATH环境变量。 安装Android S...

29360
来自专栏Youngxj

Emlog自动为文章标签添加该标签的链接

16540
来自专栏yukong的小专栏

【SpringBoot系列01】初识SpringBoot一、介绍二、目标三、实现四、总结

想必大家都一定用过spring框架,每次整合spring框架的时候总是会有无穷无尽的xml配置文件,第一次写配置文件的时候,大家还会抱着学习的心态认真读每一个配...

11230
来自专栏流柯技术学院

CentOS下Zabbix安装部署及汉化

1.安装开发软件包 yum -y groupinstall "Development Tools"

20120
来自专栏IT杂记

Tomcat源码分析一:源码导入

下载tomcat源码包 从tomcat官网tomcat.apache.org上下载tomcat8.x的源码包apache-tomcat-8.0.32-src.z...

229100
来自专栏北京马哥教育

使用Jenkins构建持续集成平台

前言 持续集成这个概念已经成为软件开发的主流,可以更频繁的进行测试,尽早发现问题并提示。自动化部署就更不用说了,可以加快部署速度,并可以有效减少人为操作的失误。...

44850
来自专栏C/C++基础

JSP学习心路

1.先安装JDK,在安装开发工具(MyEclipse、Eclipse或Netbeans)和tomcat,其中MyEclipse内置tomcat服务器;

23920

扫码关注云+社区

领取腾讯云代金券