第二十一章:SpringBoot项目中的全局异常处理
全局异常处理不管对于
API项目还是普通管理项目都是核心的部分,如果项目中遇到运行时异常,总不能每个异常处理都去添加try catch逻辑。在
SpringBoot项目中跟
SpringMVC的全局异常配置是一样的,下面我们来为
API项目配置全局异常并且返回相同格式的
JSON字符串。
本章目标
基于SpringBoot项目配置全局异常处理并且返回固定的JSON字符串。
构建项目
我们使用IntelliJ IDEA工具创建一个SpringBoot项目,事先添加依赖:Web、FastJson、Tomcat等,pom.xml配置文件内容如下图1所示:
全局异常配置只需要添加一个全局的类即可,下面我们来配置全局异常Handler。
使用@ControllerAdvice
顾名思义,@ControllerAdvice注解是用来配置控制器通知的,我们可以配置过滤拦截具体一种或者多种类型的注解,添加annotations属性即可,因为我们全局返回的都是Json格式的字符串,所以需要再类上配置@ResponseBody注解,该注解熟知SpringMvc的开发人员都知道就不做过多的解释了,RestExceptionHandler全局处理类代码如下图2所示:
我们在上图2内配置了运行时异常的方法处理,
@ExceptionHandler注解用来配置需要拦截的异常类型,默认是全局类型。
@ResponseStatus注解用于配置遇到该异常后返回数据时的
StatusCode的值,我们这里默认使用值500。在类的上方我们配置了@ControllerAdvice的annotations属性值为RestController.class,也就是只有添加了@RestController注解的控制器才会进入全局异常处理,下面我们来添加一个测试控制器。
添加测试控制器
我们创建一个名叫做IndexController的控制器,代码如下图3所示:
可以看到上图3内,我们的请求路径是/index/{number},这个number就是对应int number的值,我们输出20/number时,如果number = 0,那么就会出现RuntimeException。在测试代码之前我们需要添加一个固定返回Json的实体类ApiResult。
统一返回ApiResult实体
我们创建一个名叫ApiResult的实体,代码如下图4所示:
这个只是一个返回对象,我们将这个类的
构造函数私有化了,所以我们在外部不能直接使用
new的方式创建对象,我们提供了一个
newInstace方法来实例化
ApiResult并获取对象。下面我们创建一个ApiResultGenerator用来生成ApiResult不同状态的返回内容(成功、失败)。
ApiResultGenerator构建者
该类是用来创建成功、失败返回JSON的工具类,普通消息方法代码如下图5所示:
上图5内的方法是成功、失败共同调用的方法,成功构建ApiResult的方法如下图6所示:
失败构建ApiResult的方法如下图7所示:
运行测试
我们上面关于全局的异常处理已经配置完成,下面我们来运行项目测试全局异常是否生效,我们访问地址:127.0.0.1:8080/index/20,界面输出的效果如下图8所示:
可以看到我们的参数
number = 20时界面可以输出内容,那我们再来访问地址:127.0.0.1:8080/index/0,界面输出内容如下图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学习目录,感谢阅读!
更多干货文章扫码关注微信公众号
加入知识星球,恒宇少年带你走以后的技术道路!!!
阅读更多
- 轻松实现SpringBoot项目异常全局处理
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
- Spring boot 七 全局异常处理
- SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
- SpringBoot全局异常处理
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
- SpringBoot学习——全局异常处理设置(返回JSON)
- springboot实际项目:日志打印、表单验证、异常处理
- Spring-Boot--日志操作【全局异常捕获消息处理☞日志控制台输出+日志文件记录】
- spring boot全局异常处理
- spring boot之全局异常处理代码demo
- Spring-Boot--日志操作【全局异常捕获消息处理☞日志控制台输出+日志文件记录】
- SpringBoot全局异常处理(续)
- spring boot学习教程(4):全局异常处理代码demo
- SpringBoot全局异常处理
- springboot全局异常处理详解
- Spring-Boot(五) 全局异常处理
- SpringBoot----全局异常处理
- SpringBootWEB项目和非Web项目的全局异常捕获
- Spring boot 前后台分离项目 怎么处理spring security 抛出的异常