继承 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://xiahunao.cn/news/2871502.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言_字符函数和字符串函数_复习篇】

目录 一、字符函数 1.1 字符分类函数 1.2 字符转换函数 二、字符串函数 2.1 strlen函数 2.1.1 strlen函数的使用 2.1.2 strlen函数的模拟实现 2.2 strcpy函数 2.2.1 strcpy函数的使用 2.2.2 strcpy函数的模拟实现 2.3 strcat函数 2.3.1 strcat函数的使用 2.3.2 strcat函数的…

基于深度学习LSTM+NLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM+机器学习双推荐算法+scrapy爬虫+NLP情感分析+数据分析可视化)

文章目录 基于深度学习LSTMNLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM机器学习双推荐算法scrapy爬虫NLP情感分析数据分析可视化)项目概述深度学习长短时记忆网络(Long Short-Term Memory,LSTM)机器学习协…

ISIS默认层级实验简述

ISIS被划分为三个层级:Level 1、Level 2和Level 1-2。 默认情况下,ISIS路由器属于level 1-2,是指同时支持Level 1和Level 2的路由器。路由器既可以在同一个自治系统内部进行路由选择,也可以将路由信息传递到其他自治系统。 实验拓扑图&#…

C# 打开文件对话框(OpenFileDialog)

OpenFileDialog&#xff1a;可以打开指定后缀名的文件&#xff0c;既能单个打开文件也能批量打开文件 /// <summary>/// 批量打开文档/// 引用&#xff1a;System.Window.Fomrs.OpenFileDialog/// </summary>public void OpenFile(){OpenFileDialog dialog new Op…

execl/python读取数据库( Access、MySQL)

目录 一 、读取access数据库 &#xff08;一&#xff09;execl读取数据库 1.搜索ODBC&#xff08;注意自己的execl是64位还是32位&#xff09; 2.安装数据源的驱动程序 3.打开execl 4. 补充&#xff1a;选择数据源时&#xff0c;也可以直接在execl中选择数据源 &#xff…

如何实现队列和栈的转化(c语言)

文章目录 一.什么是栈二.什么是队列三.怎么把栈变成队列&#xff08;力扣&#xff09;四.怎么把队列变成栈&#xff08;力扣&#xff09;总结 一.什么是栈 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。限定权在表尾进行插入和删除操作的线性…

Git——本地使用详解

目录 Git1、开始版本控制1.1、初始化Repository1.2、使目录脱离Git控制 2、把文件交给Git管控2.1、创建文件后交给Git2.2、git add之后再次修改文件2.3、git add "--all"与"."参数区别2.4、把暂存区的内容提交到存储库里存档 3、工作区、暂存区与存储库3.1…

生成式AI竞赛:开源还是闭源,谁将主宰未来?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

C语言基础-内联函数在头文件中的定义

文章目录 前言inline关键字优点缺点使用注意 头文件中定义函数内联函数在头文件中的定义总结 前言 在软件开发过程中&#xff0c;大家可能很少会遇到inline关键字&#xff0c;也可能很少见到头文件中定义函数体。没有用过不代表不能了解&#xff0c;菜就多练&#xff01;哈哈哈…

从零开始搭建游戏服务器 第三节 Protobuf的引入并使用

目录 上一节问题答案公布本节内容Protobuf介绍正文在build.gradle引入protobuf编写proto并生成使用生成的proto来进行数据传输 总结 上一节问题答案公布 上一节我们创建了ConnectActor&#xff0c;并且使用ConnectActorManager和connectId将其管理起来。 并且我们在收到客户端…

【Twinmotion】Twinmotion导入UE5

步骤 1. 在虚幻商城中安装“Datasmith Twinmotion导入器插件” 安装“面向虚幻引擎的Twinmotion内容” 2. 打开虚幻引擎&#xff0c;在插件中搜索“twinmotion”&#xff0c;勾选如下两个插件&#xff0c;然后重启虚幻引擎 3. 打开Twinmotion&#xff0c;随便添加一个物体 导出…

腾讯云2核2G免费服务器申请流程,2024免费服务器入口

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

4.1_5 文件存储空间管理

文章目录 4.1_5 文件存储空间管理&#xff08;一&#xff09;存储空间的划分与初始化&#xff08;二&#xff09;存储空间管理——空闲表法&#xff08;三&#xff09;存储空间管理——空闲链表法&#xff08;1&#xff09;空闲盘块链&#xff08;2&#xff09;空闲盘区链 &…

VScode----debug调试python代码添加上额外命令(args)

这里写目录标题 问题描述问题解决 更多内容可以点击这里查看个人博客&#xff1a;个人博客 问题描述 在服务器上运行python代码时&#xff0c;总会添加上额外的参数一般是用jyputer或者终端直接加上命令&#xff0c;现在我在vscode调试远程代码的时候想要加上这些命令. 问…

DFL《384底丹 430万》 wf/df-udt/448/96/96/32预训练模型

384底丹430万迭代&#xff1a;点击下载 训练素材19万张来自于以下数据集&#xff1a; 【更新】DST全角度训练图集V3.1 WF512【2.6W张 6GB 】【人脸混合_WF】FFHQ女性人脸数据&#xff0c;预训练炼丹专用【金鱼基础模型库】用于补全SRC极限角度香港中文大学CelebA预训练集-WF5…

HarmonyOS NEXT应用开发—状态栏显隐变化

介绍 本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化。该场景多用于各种软件的首页、我的等页面中。 效果预览图 使用说明 加载完成后显示状态栏显隐变化页面&#xff0c;上下拖动屏幕&#xff0c;顶端状态栏出现显隐变化。 实现思路 在置顶位置使用sta…

Vue-router3.0版本跳转报错

1.路由创建之后发现控制台push路由跳转报错了 2.解决方法&#xff1a; //在router文件中添加 const originalPush VueRouter.prototype.push VueRouter.prototype.push function push(location) {return originalPush.call(this, location).catch(err > err) }3.解决了

webpack5零基础入门-10babel的使用

Babel JavaScript 编译器。 主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法&#xff0c;以便能够运行在当前和旧版本的浏览器或其他环境中 1.安装相关包 npm install -D babel-loader babel/core babel/preset-env 2.进行相关配置 2.1第一种写法是在webp…

Day67:WEB攻防-Java安全JNDIRMILDAP五大不安全组件RCE执行不出网

知识点&#xff1a; 1、Java安全-RCE执行-5大类函数调用 2、Java安全-JNDI注入-RMI&LDAP&高版本 3、Java安全-不安全组件-Shiro&FastJson&JackJson&XStream&Log4j Java安全-RCE执行-5大类函数调用 Java中代码执行的类&#xff1a; GroovyRuntimeExecPr…

git如何回退版本reset和revert命令的区别

文章目录 git回退版本的方法使用reset回退使用revert回退 总结 git回退版本的方法 Git回退到某个版本有两种方法&#xff1a;reset和revert。 使用reset回退 git reset --hard <版本号>该命令将HEAD指针移动到指定的版本&#xff0c;并重置工作目录和暂存区的内容。这…