继承 ResponseEntityExceptionHandler

目录

作用概述

示例-HttpRequestMethodNotSupportedException

示例-自定义异常处理

总示例

使用了ResponseEntityExceptionHandler后,为什么发生了异常后返回体为空

方法执行顺序


作用概述

  • 这是一个方便的基类,用于希望通过 @ExceptionHandler 方法在所有 @RequestMapping 方法中提供集中化异常处理的 @ControllerAdvice 类
  • 如果我们不继承它,那么所有异常将被重定向到 DefaultHandlerExceptionResolver ,它返回一个 ModelAndView 对象
  • 这个基类提供了一个用于处理内部Spring MVC异常的 @ExceptionHandler 方法
  • 与返回 ModelAndView 的 DefaultHandlerExceptionResolver 不同,此方法返回 ResponseEntity 以通过消息转换器写入响应
  • 如果不需要将错误内容写入响应体,或者使用视图解析(例如,通过 ContentNegotiatingViewResolver),那么 DefaultHandlerExceptionResolver 就足够好了
  • 注意,为了检测到一个 @ControllerAdvice 子类,必须配置 ExceptionHandlerExceptionResolver
  • 它是 Spring 推荐的 ControllerAdvice 的基类,它提供了大量 Spring MVC 的异常的处理方法,通过对这些方法做重载可以自定义具体的报错信息
  • ResponseEntityExceptionHandler 包装了各种Spring MVC在处理请求时可能抛出各类异常的处理
  • 通过对该类的继承,可以重写对应的处理逻辑
  • 如果继承了ResponseEntityExceptionHandler来处理异常,那么默认的异常的响应结果为空,如果想不为空,则需要我们自己处理(自己添加body)
  • 例如:

示例-HttpRequestMethodNotSupportedException

  • 下面讲述了如何定义当对仅定义了 POST 方法的端点进行 GET 请求时发生的 HttpRequestMethodNotSupportedException 的任意响应体
  • 首先,创建一个继承自 ResponseEntityExceptionHandler 的任意类(这里将类名设为 CustomControllerAdvice)
  • 接下来,需要在类上添加 @RestControllerAdvice 注解
  • 然后开始覆盖相应的方法
  • 方法名以 handle〇〇 的形式命名,这里的 〇〇 是去掉了 “Exception” 的异常名称
  • 返回的 handleExceptionInternal 方法的参数是按照以下的形式来填充的
  • 第1个参数:异常
  • 第2个参数:响应体
  • 第3个参数:响应头
  • 第4个参数:HTTP状态
  • 第5个参数:WebRequest
  • 在发生 HttpRequestMethodNotSupportedException 时,定义了一个名为 res 的 Map,并将其作为响应体
  • 实际的响应体内容如下所示
  • 如果您想尝试的话,可以创建如下的简单控制器,在启动应用程序后用 GET 访问 localhost:8080,便可以确认处理流程

示例-自定义异常处理

  • 我们之前讨论了现有的异常处理,接下来我们将看看如何处理自定义异常
  • 假设我们定义了一个异常,当找不到用户时会触发这个异常
  • 这个异常发生时的处理方式,我们将按照之前的方式来定义
  • 这里需要标注@RestControllerAdvice
  • 首先,方法需要使用@ExceptionHandler注解
  • 方法名称可以随意命名,但是如果使用类似handleXX这样的命名风格,与现有的异常处理方法名称保持一致,会更容易理解
  • 第一个参数应该是自定义的异常类,第二个参数应该是WebRequest
  • 和之前一样,我们在变量res中定义了响应体的值
  • 定义的响应体如下所示:
  • 如果你想尝试这个,可以创建一个控制器,通过GET请求访问localhost:8080来验证其功能

总示例

  • 定义异常处理时,继承 ResponseEntityExceptionHandler
  • 重写 handleExceptionInternal() 实现 ResponseEntityExceptionHandler 中定义的常见异常处理
  • 在下面的示例中,创建的 ResponseError 始终设置为响应正文
  • 如果要单独设置每个异常,请重写每个 handle 方法
  • 以下内容将覆盖抛出 MethodArgumentNotValidException 时发生的情况
  • 到目前为止的设置仅适用于 ResponseEntityExceptionHandler 中定义的异常
  • 也就是说,一开始解释的自制类和 ResponseStatusException 都没有覆盖
  • 如果要对这些异常执行类似的处理,请定义附加 @ExceptionHandler 的 handle 方法
  • 例如, ResponseStatusException 的处理定义如下:
  • 通过重写 handleAll() 定义未指定 @ExceptionHandler 的异常的处理
  • 如果未定义,堆栈跟踪内容将包含在响应数据中
  • 如果定义了这个,堆栈跟踪将不会输出到日志,因此您需要编写一个单独的过程来输出它

使用了ResponseEntityExceptionHandler后,为什么发生了异常后返回体为空

  • 默认情况下,继承了 ResponseEntityExceptionHandler这个类后,这个类处理的所有异常的响应结果都是 null,如果想返回别的值需要我们自己去处理

方法执行顺序

  • 提供对标准 Spring MVC 异常的处理(handleException)
  • ->
  • 根据具体Exception进入对应handleXXX
  • 若是未知异常,则重新抛出给定的异常,以便通过 HandlerExceptionResolver 链进行进一步处理
  • ->
  • 从对应handleXXX进入一个用于自定义所有异常类型响应体的统一地方(handleExceptionInternal),返回ResponseEntity
  • 它默认实现设置了 WebUtils.ERROR_EXCEPTION_ATTRIBUTE 请求属性,并从给定的正文、头部和状态创建了一个 ResponseEntity

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue项目的搭建

Node.js 下载 Node.js — Download (nodejs.org)https://nodejs.org/en/download/ 安装 测试 winR->cmd执行 node -v配置 在安装目录下创建两个子文件夹node_cache和node_global,我的就是 D:\nodejs\node_cache D:\nodejs\node_global 在node_global文件下再创建一个…

并查集(详解+例题)

1、作用 将两个集合合并 询问两个元素是否在一个集合中 2、基本原理 每个集合用一颗树表示。树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。 3、实现 问题1:如何判断树根:if(p[x]x); 问题2:如何求…

C++ 特殊类及单例模式

文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类(单例模式) 1. 前言 在实际场景中,我们在编写类的过程中总会遇到一些特殊情况,比如设计一个类不…

深入解析红黑树(RB-Tree):原理、操作及应用

文章目录 一、红黑树的特点与性质二、红黑树的实现1、实现红黑树的插入操作2、红黑树的验证方法a. Check 函数b. IsBalance 函数 红黑树作为一种自平衡的二叉搜索树,在计算机科学领域中占据着重要的地位。它的设计旨在在维持树的平衡性的同时,保证各种操…

红队攻防之exe文件签名免杀

达则兼善天下,穷则独善其身 1、生成 cobaltstrike bin文件,选择raw选项。 2、使用 cobaltstrike分离免杀工具生成loader.exe文件。 3、使用UPX对生成的exe文件进行加壳,加壳前后对比文件的大小。 4、对loader.exe进行制作并签发证书-数字签名…

UDF提权

目录 一、UDF概述 二、提权条件 三、漏洞复现 (一) 信息收集 1. Nmap信息收集 1.1、查看当前IP地址 1.2、扫描当前网段,找出目标机器 1.3、快速扫描目标机全端口 2. dirb目录扫描 3. 第一个flag 3.1、目录遍历漏洞 3.2、flag 4. 敏感信息利用 (二) 漏…

ElasticSearch常见用法,看这一篇就够了(文末送书)

2024送书福利正式起航 关注「哪吒编程」,提升Java技能 文末送3本《一本书讲透Elasticsearch:原理、进阶与工程实践》 大家好,我是哪吒。 ElasticSearch是一款由Java开发的开源搜索引擎,它以其出色的实时搜索、稳定可靠、快速安…

土壤水分实测数据网站资源

农田土壤水分数据 貌似是站点数据,但是年份太老,而且也没找着下载的地方 2012年黄土高原土壤水分及相关土壤物理参数数据集 2007-2009年中国农业大学石羊河实验站玉米通量与生长观测数据集 2005~2014年CERN野外台站气象观测场土壤含水量数据…

一维差分(模板)

差分是前缀和的逆运算&#xff0c;对于一个数组a&#xff0c;其差分数组b的每一项都是a [ i ]和前一项a [ i − 1 ]的差。 注意&#xff1a;差分数组和原数组必须分开存放&#xff01;&#xff01;&#xff01;&#xff01; #include <iostream> using namespace std;t…

【回归预测】基于SSA-BP(麻雀搜索算法优化BP神经网络)的回归预测 多输入单输出【Matlab代码#69】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. BP神经网络2. 麻雀搜索算法3. SSA-BP神经网络模型的构建4. 部分代码展示5. 仿真结果展示 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. BP神经网络 BP&…

算法:一些DFS的经验

DFS:可以看作是向下遍历树的模拟 剪枝&#xff1a;减少时间复杂度 一个dfs所需要具备的元素&#xff1a; 一&#xff0c;出口 1.出口&#xff1a;每一个进入的dfs的出口&#xff0c;可以是枚举全部元素后退出该dfs,也可以是大于层数或剪枝条件........ 二&#xff0c;向下搜…

Linux:系统初始化,内核优化,性能优化(3)

优化系统的文件句柄数&#xff08;全局&#xff09; 也就是系统的最大文件数量 查看最大数量 cat /proc/sys/fs/file-max 当我们的服务器有非常大的一个数据并发的时候十几二十万的文件需要去配置&#xff0c;可能这个是远远不够的&#xff0c;我们就要去修改 vim /etc/sy…

springboot换日志框架后爆SLF4J: Class path contains multiple SLF4J bindings的解决办法

sringboot原本使用的是logback日志框架&#xff0c;将它去掉&#xff0c;修改为log4j2日志框架后&#xff0c;往往会出现以下错误&#xff1a; SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/admin/.m2/repository/ch/qos…

NuGet程序包管理器

文章目录 1.为什么要用包管理工具&#xff1f;2.常用的包管理工具3.Net中的包管理工具4.使用方式4.1 命令行使用4.2 图形界面 5.Tips 1.为什么要用包管理工具&#xff1f; 开发过程中几乎不可避免地要使用第三方包&#xff0c;当然可以不用包管理器。对于开源的项目可以直接引用…

稀碎从零算法笔记Day20-LeetCode:回文链表

题型&#xff1a;链表、双指针 链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 234. 回文链表 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述&#xff08;红字为笔者添加&#xff09; 给你一个单链表的头节点 head &…

基于Python的口罩佩戴识别的设计与实现(UI界面+MySQL数据库+YOLOv5+训练数据集+开题报告+中期检查+论文)

摘要 本文旨在基于Python开发一种口罩佩戴识别系统&#xff0c;通过深度学习技术实现对口罩佩戴情况的准确检测。采用了YOLOv5系列目标检测算法作为基础模型&#xff0c;并结合迁移学习进行训练和优化。同时&#xff0c;为了提供更好的用户体验&#xff0c;本系统还设计…

代码算法训练营day9 | 28. 实现 strStr() 、459.重复的子字符串

day9&#xff1a; 28. 实现 strStr()KMP的主要应用&#xff1a;什么是前缀表&#xff1a;前缀表是如何记录的&#xff1a; 如何计算前缀表&#xff1a;构造next数组&#xff1a;1、初始化2、处理前后缀不相同的情况3、处理前后缀相同的情况 代码&#xff1a; 459.重复的子字符串…

JUC之AQS

AQS抽象的队列同步器 public abstract class AbstractQueuedSynchronizerextends AbstractOwnableSynchronizerimplements java.io.Serializable {AbstractQueuedSynchronizer 是用来实现锁或者其他同步器组件的公共基础部分的抽象实现&#xff0c;是重量级基础框架及整个JUC体…

网络编程—DAY3

模拟面试 1.什么是IP地址 是给互联网上的每台主机分配的唯一标识 2.IP地址和mac地址的区别 mac地址是设备的硬件地址&#xff0c;ip地址是给主机分配的网络地址 3.当电脑从一个网络切换到另一个网络哪个会变 ip地址会变&#xff0c;mac地址不会变 4.什么是端口号 用于区…

不锈钢多功能电工剥线钳分线绕线剪线剥线钳剥线压线扒皮钳子

品牌&#xff1a;银隆 型号&#xff1a;089B绿色 材质&#xff1a;镍铬钢&#xff08;不锈钢&#xff09; 颜色分类&#xff1a;089B灰色,089B红色,089B绿色,089B黑色,089B橙色 功能齐集一身&#xff0c;一钳多用&#xff0c;多功能剥线钳。剥线&#xff0c;剪线&#xff…