Spring Boot 统一功能处理(三)

本篇主要介绍Spring Boot的统一异常处理。

目录

一、统一异常处理的使用

二、测试统一异常处理效果

三、浅析原理

@ControllerAdvice简析

统一处理异常简析


一、统一异常处理的使用

在前面介绍统一数据返回时,我们在程序发生异常时会把整个报错信息都封装在data里返回给前端,这显然是不太合适的,毕竟让懂后端的前端看到这些具体的报错信息还挺羞耻的,因此我们来看一下如何对异常进行统一处理。

首先我们需要创建统一处理异常的类,并加上@ControllerAdvice注解:

接下来我们需要自己定义一个处理异常的具体方法handler,其参数为需要处理的异常,并在方法上加上@ExceptionHandler注解:
 

如果需要处理多个异常,则可以重载handler方法:

 定义完这些方法之后,当我们的程序发生异常时则会自动执行这里对应的handler方法来进行统一的异常处理,并将handler的返回结果写到响应数据里,但由于Spring默认是返回Html,因此我们还需要在方法或者类上加上@RespondyBody注解来调整返回数据类型。

二、测试统一异常处理效果

接下来我们来测试一下统一异常处理的效果:

在Controller里,定义两个test方法,并分别制造一个异常,一个为空指针异常,一个为算术异常:

然后我们再修改一下前面定义的handler,让其更加规范一点

接下来我们通过PostMan来测试一下前面定义的这两个方法:

 访问test05

访问test06 

 通过测试结果可以发现,当由于空指针异常在我们定义的统一处理类中进行对应的实现,因此调用了参数为空指针异常的handler方法,而算术异常则没有对应实现,所以调用了以Exception为参数的handler方法来处理,因此我们可以得出结论,当发生异常时会优先去寻找与异常类型一致的handler方法来进行处理,如果没有类型一致的则会去找参数为当前异常的类型的上级(父类)的handler方法来处理,其内部具体逻辑将在下文介绍。

三、浅析原理

@ControllerAdvice简析

前面在介绍初始化DispatchServerlet时,提到过在初始化最后会初始化九大组件,这九大组件中有一个HandlerAdapters,初始化这个组件时会去获取所有实现了HandlerAdapt的Bean,在这些Bean中有一个叫做RequestMappingHandlerAdapt,这个Bean会获取所有加了@ControllerAdvice注解的Bean,并进行处理。

 处理完后,一旦发生了这些加了@ControllerAdvice标注的Bean对应的事件,就会调用其对应的Advice方法,例如在进行统一功能处理时,如果有数据返回了,系统就会在这个里面找对应的Bean,并调用这个bean中处理返回数据的方法。

统一处理异常简析

对于统一异常的处理,还是得追溯到九大组件,在这九大组件里有一个HandlerExceptionResolvers,初始化这个组件会去获取所有实现HandlerExceptionResolvers接口的Bean,在这些Bean中,有一个叫ExceptionHandlerExceptionResolvers的Bean,这个也会去获取所有@ControllerAdvice标注的Bean

并且它会创建一个ExceptionHandlerMethondResolver。

 当项目里有异常发生时 ,会通过DispathcServerlet来解析异常,而DispatchServerlet则会通过ExceptionHandlerExceptionReslover来解析异常,最后ExceptionHandlerExceptionReslover再通过这个ExceptionHandlerMethondResolve来解析异常。ExceptionHandlerMethondResolve会将异常解析到前面对应的加了@ExceptionHandler的handler方法,具体为如下这串代码。

在这个代码里,会先创建一个List metches,

然后去获取当前异常能够匹配到的所有异常类型(包括当前异常的类型及其所有父类异常的类型),

并将这些类型添加到matches里。如果在matches添加了不止一个,也就是matches.size() > 1 ,就会对matches按类型的深度进行排序(例如当前异常类型为NullpointException,那么NullpointException的深度就为0,其父类RuntimeException的深度则为1,然后以此类推,每往上一级,深度就加一),

排完序后,则会将参数为matches中第一个类型(也就是深度最小的异常类型)这种类型的加了@Exception批注的handler方法返回。最后再由其它类来执行这个方法。

所以在前面我们在前面测试test05时访问的是参数为NullpointException的handler方法,因为在访问test05时会发生空指针异常,而发生空指针异常时NullpointException的深度最小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/559780.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BRC20铭文铭刻解析

BRC20铭文铭刻的出现对于智能制造无疑是一个重要的里程碑。随着科技的飞速发展,智能制造已经成为制造业发展的必然趋势!智能制造是指通过运用人工智能、物联网、大数据等先进技术,实现生产过程的自动化、智能化和高效化。 1. BRC20铭文的概念…

Docker了解及命令行使用

一、了解Docker 1、什么是Docker Docker为应用程序的开发、发布和运行提供了一个基于容器的标准化平台。容器运行的是应用程序,Docker平台用来管理容器的整个生命周期 2、虚拟机与容器 2.1、虚拟机是什么 虚拟机(Virtual Machine)是一种软…

PostgreSQL 免费的对象-关系数据库

目录 一、什么是数据库 二、ORDBMS 的一些术语 三、PostgreSQL 概述 四、PostgreSQL数据库优点和缺点 4.1PostgreSQL数据库的优点 4.2PostgreSQL数据库的缺点 4.3PostgreSQL 特征 五、Linux 上安装 PostgreSQL 5.1Yum 安装 PostgreSQL 5.1.1安装postgreSQL的官方yum仓…

华火电燃灶:重拾烹饪艺术的黄金法则,打造家庭美食的温馨记忆

记得在饭店给客户人炒菜的时候,炉灶下的每一道菜都透着诱人的香气。无论是炒肉还是炖汤,那股鲜香总让人回味无穷。然而,回到家,用上自家的燃气灶,发现同样的食材、同样的配方,味道却平淡无奇,仿…

记录一个hive中因没启yarn导致的spark引擎跑insert语句的报错

【背景说明】 刚在hive中配置了Spark引擎,在进行Hive on Spark测试时报错, 报错截图如下: [atguiguhadoop102 conf]$ hive which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/mod…

一个简单的java递归下降语法分析器例子

import parser.Parser; import parser.RecursiveDescentParser;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Main {public static void main(String[] args) {// 关键词List<String> keyList new ArrayList<>(Arra…

npm i 依赖下载失败

git config --global url."https://".insteadOf git://解决npm install 报错 npm ERR code 128 Permission denied_please make sure you have the correct access right-CSDN博客

Apache Answer 开源问答社区安装体验

Answer 是由 SegmentFault 思否团队打造的一款问答平台软件,后端使用 Go 语言编写,于2022年10月24日(程序员节)正式开源。你可以免费使用 Answer 高效地搭建一个问答社区,并用于产品技术问答、客户支持、用户交流等场景。 2023年10月9日,Answer 顺利通过投票,以全票通过…

【Python】函数基础(纯干货版)

目录 什么是函数 函数定义 函数的文档说明 局部变量和全局变量 综合案例&#xff1a;模拟实现ATM界面 什么是函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用于实现特定功能的代码段&#xff0c;将功能封装在函数内&#xff0c;可供随时随地重复利用&#xff…

BTP连接cloud connector中配置的SAP

登录地址 登录之后可以看到我们已经配置成功的后端系统SAP。 从cloud connector中获取location ID ,然后在BTP中配置Destination 选择目标标签页&#xff0c;点击‘新建目标’&#xff0c;如下图&#xff1a; 新建连接 暂时不知道错误原因 创建目标-HTTP  新建目标&…

(五)STM32F407 cubemx定时器PWM驱动舵机

这篇文章主要是个人的学习经验&#xff0c;想分享出来供大家提供思路&#xff0c;如果其中有不足之处请批评指正哈。 废话不多说直接开始主题&#xff0c;本人是基于STM32F407VET6芯片&#xff0c;但是意在你看懂这篇文章后&#xff0c;不管是F1,F4,H7等一系列系统定时器PWM配置…

动态IP与静态IP的区别,你选对了吗?

在互联网世界中&#xff0c;IP地址是每台设备在网络上的唯一标识。这些地址可以是动态的&#xff0c;也可以是静态的。对于非专业人士来说&#xff0c;理解这两者之间的区别可能会有些困难。本文旨在深入探讨动态IP和静态IP的主要差异&#xff0c;帮助读者根据自己的需求做出明…

华为sr-mpls policy配置案例

SR&#xff0d;MPLS POLICY在ensp上面做不了&#xff0c;这是官方上的配置

CSS基础之伪元素选择器(如果想知道CSS的伪元素选择器知识点,那么只看这一篇就足够了!)

前言&#xff1a;我们已经知道了在CSS中&#xff0c;选择器有基本选择器、复合选择器、伪类选择器、那么选择器学习完了吗&#xff1f;显然是没有的&#xff0c;这篇文章讲解最后一种选择器——伪元素选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

爱上JDK源码阅读-Integer

知识点 自动装箱和拆箱IntegerCache机制toString()实现算法优化 从一道面试题开始 Integer a 100; int b 100; if (a b) {System.out.println("a b"); } else {System.out.println("a ! b"); }聪明的你应该马上可以知道答案了&#xff0c;输出就是 …

【SQL】DISTINCT GROUP BY

找到所有办公室里的所有角色&#xff08;包含没有雇员的&#xff09;,并做唯一输出(DISTINCT) 用DISTINCT : SELECT DISTINCT B.Building_name,E.Role FROM Buildings B LEFT JOIN Employees EON B.Building_name E.Building需要找到的结果&#xff1a;所有办公室名字&#…

C# 图像旋转一定角度后,对应坐标怎么计算?

原理分析 要计算图像内坐标在旋转一定角度后的新坐标&#xff0c;可以使用二维空间中的点旋转公式。假设图像的中心点&#xff08;即旋转中心&#xff09;为 (Cx, Cy)&#xff0c;通常对于正方形图像而言&#xff0c;中心点坐标为 (Width / 2, Height / 2)。给定原坐标点 (X, …

10:HAL---高级定时器

前言&#xff1a; 高级定时器具有通用定时器的所有功能&#xff0c;我们在这里面只说它不一样的地方。&#xff08;通用定时器不具备的功能&#xff09; 一&#xff1a;高级定时器 1&#xff1a;介绍 2&#xff1a;重复计数器 在我们普通的定时器中当CNTCCR时直接发生溢出。然…

阿里二面凉了,难蹦。。。

分享一位同学阿里巴巴的后端面经&#xff0c;共有 2 面&#xff0c;第一面很顺利过了&#xff0c;可惜挂在第二面。 这两面的知识点范围&#xff0c;我帮大家罗列一下&#xff1a; 网络&#xff1a;TCP、HTTP mysql&#xff1a;索引应用、索引结构、隔离级别、最左匹配 redis…

图小灵的多线程

进程 简而言之,一个运行的程序就叫作进程 管理进程,要先将进程使用类/结构体,表示各个属性 为了后续增删改查,需要将进程通过数据结构串联起来 系统中有一个结构体专门用来表示进程的属性,叫作PCB(进程控制块) 一个进程使用一个或者多个PCB来表示 系统会使用类似于双向链…