Spring MVC异常处理

news2024/11/13 16:42:07

Spring MVC异常处理

    • Spring MVC异常处理机制
    • HandlerExceptionResolver的实现类
    • DefaultHandlerExceptionResolver实现类
    • DefaultHandlerExceptionResolver

在Controller的请求处理方法中手动使用try…catch块捕捉异常,当捕捉到指定的异常时,系统返回对应的逻辑视图名——但这种异常处理方式非常烦琐,需要在请求处理方法中书写大量的catch块。其最大的缺点还在于异常处理与代码耦合,一旦需要改变异常处理方式,必须修改大量的代码!这是一种相当糟糕的方式。
对于MVC框架,希望其提供的异常处理流程
在这里插入图片描述
异常处理流程是,当控制器的处理方法处理用户请求时,如果出现了异常1,则系统转入视图资源1,并在该视图资源上输出异常提示;如果出现异常2,则系统转入视图资源2,并在该视图资源上输出异常提示。
在这里插入图片描述
假如在控制器的处理方法中使用try…catch块来捕捉异常,当捕捉到指定的异常时,系统返回对应的逻辑视图名——这种处理方式完全是手动处理异常,非常烦琐,而且可维护性不好:如果有一天需要改变异常处理流程,则必须修改控制器的代码。

如果手动捕捉(catch)异常,然后返回(return)一个字符串作为逻辑视图名,其实质就是定义异常类与逻辑视图名之间的对应关系。既然如此,那么完全可以将这种对应关系放在配置文件中进行管理。实际上,早期Spring MVC确实是这么干的——那时候Spring MVC主要还是受Struts 2的影响。

Spring MVC异常处理机制

主要由HandlerExceptionResolver接口负责处理,该接口中只定义了如下抽象方法:

在这里插入图片描述
看这个方法的参数和返回值,是不是一切全明白了?
该方法包含4个参数,其中request、response参数不用管,毕竟处理Web请求总离不开这些Servlet API;handler代表抛出异常的处理方法;Exception ex是关键参数,其返回值是ModelAndView——该异常解析器做的事情是什么?不就是完成Exception类与ModelAndView的对应关系吗?
Spring MVC为HandlerExceptionResolver接口提供的实现类如图
在这里插入图片描述

HandlerExceptionResolver的实现类

有如下几个。
➢ SimpleMappingExceptionResolver:这是Spring MVC刚出现时提供的实现类,完全是模仿Struts 2的一个实现类,现在一般不推荐使用它。
➢ DefaultHandlerExceptionResolver:它是Spring MVC默认的异常解析器。

➢ ResponseStatusExceptionResolver:它负责为@ResponseStatus注解修饰的异常类提供底层支持。
➢ ExceptionHandlerExceptionResolver:它负责为@ExceptionHandler注解修饰的异常处理方法提供底层支持。
➢ HandlerExceptionResolverComposite:它是一系列异常解析器的前端代理。

随着Spring 1.0面世的Spring MVC,难免受到Struts 2的影响,因此HandlerExceptionResolver只有一个实现类:SimpleMappingExceptionResolver,它的设计哲学完全模仿Struts 2:在配置文件中定义异常类与逻辑视图名之间的对应关系。

如果Spring MVC一直停留在“模仿Struts 2”的层次,那么就不会有今天Spring MVC的辉煌了。

伴随着Spring 3的“王者归来”,Spring MVC带来了“颠覆式”的异常处理机制,它彻底脱离了Struts 2的窠臼,改为基于AOP的异常处理机制。这种异常处理机制不仅能定义异常类与逻辑视图名之间的对应关系,还可对异常做一些额外的修复处理,并彻底将异常处理代码与业务处理代码分离。这种异常处理机制的底层由ResponseStatusExceptionResolver、ExceptionHandlerExceptionResolver等实现类提供支持;而开发者使用@ResponseStatus、@ExceptionHandler、@ControllerAdvice注解,以声明式方式进行异常处理即可。

至于

DefaultHandlerExceptionResolver实现类

,它是Spring MVC内置的异常解析类,定义了常见异常类与HTTP状态码之间的对应关系。比如MissingPathVariableException异常类,对应500(SC_INTERNAL_SERVER_ERROR)、TypeMismatchException异常类对应400(SC_BAD_REQUEST)……关于该类支持的异常类与HTTP状态码之间的对应关系,读者可自行参看该类的API文档。

DefaultHandlerExceptionResolver类只能支持这些异常类,因为它的源代码就是在doResolveException()方法中以“硬编码”方式写死了这些异常类与HTTP状态码之间的对应关系的——读者可自行查看这个实现类的源代码。

DefaultHandlerExceptionResolver

是Spring MVC框架本身使用的异常解析器,开发者一般不会直接用到它。
总结:Spring MVC的异常处理机制无非两类。
➢ 使用SimpleMappingExceptionResolver,基于配置文件的异常处理机制。这种机制完全类似于Struts 2的异常处理机制。

➢ 使用@ResponseStatus、@ExceptionHandler、@ControllerAdvice,基于AOP的异常处理机制。这是目前主流的异常处理机制。
本节将会简单介绍使用SimpleMappingExceptionResolver的传统的异常处理机制,重点还是以使用@ResponseStatus、@ExceptionHandler、@ControllerAdvice的异常处理机制为主。

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

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

相关文章

ABBYY FineReader15最新专业的PDF OCR图片文字识别软件

ABBYY FineReader PDF15是专业的OCR图片文字识别软件,可以快速、准确、方便地将扫描纸质文件、PDF格式及数字或移动电话图像转换成可编辑格式——Microsoft Word、Excel、PowerPoint、可检索的PDF、HTML、DjVu等。99.8%的识别准确率即刻识别文本,复制和粘…

Stanley 轨迹跟踪算法研究

Stanley 轨迹跟踪算法研究 理论基础 首先还是阅读论文 《基于改进鲸鱼优化算法的Stanley算法研究》 《复杂环境下的移动机器人路径规划技术研究》 《Stanley:The Robot that Won the DARPA Grand Challenge》 《无人驾驶汽车轨迹跟随控制研究》 《基于混合算法的校园智能车路…

【kafka】-分区-消费端负载均衡

一.为什么kafka要做分区? 因为当一台机器有可能扛不住(类比:就像redis集群中的redis-cluster一样,一个master抗不住写,那么就多个master去抗写),把一个队列的单一master变成多个master&#xf…

学习嵌入式

最近,打算了解一些关于嵌入式的知识。这里先了解嵌入式到底是什么。

[ MySQL ] — 常见函数的使用

目录 日期函数 current_date — 获取当前日期 current_time — 获取当前时间 current_timestamp — 获取当前时间戳 date — 获取参数的日期部分 ​编辑 date_add — 在日期或时间的基础上进行增加 date_sub — 在日期或时间的基础上进行减少 datediff — 计算两个日期相差…

快速上手Linux核心命令:Linux系统信息相关命令

前言 这期呢主要说一说Linux中与系统相关的命令,一共包含10个命令 uname 显示系统信息 1、简介 uname命令用于显示系统相关信息,比如内核版本号、硬件架构等 2、语法格式 uname [参数选项] 3、参数说明 参数参数说明-a显示系统所有相关信息-m显示计算…

通过重构来加深理解——DDD

要想成功地开发出实用的模型,需要注意以下三点: (1)复杂巧妙的领域模型是可以实现的,也是值得我们去花费力气实现的。 (2)这样的模型离开不断的重构是很难开发出来的,重构需要领域专…

2. Linux Server 20.04 Qt5.14.2配置Jetson Orin Nano Developer Kit 交叉编译环境

最近公司给了我一块Jetson Orin Nano的板子,先刷了系统(1.Jetson Orin Nano Developer Kit系统刷机)又让我搭建交叉编译环境,所以有了下面的文章 一 :Qt5.14.2交叉编译环境安装 1.准备 1.1设备环境 1.1.1 Server: Ubuntu20.0…

md文本学习

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

腾讯云轻量应用服务器配置_网站上线全流程

腾讯云轻量应用服务器CPU内存带宽配置高,成本很低,腾讯云百科来详细说下腾讯云服务器从购买、配置到网站上线全流程,包括轻量服务器配置选择、应用镜像选择、重置密码、防火墙开放端口教程等详细教程: 目录 一:注册腾…

年薪100w的项目组合和项目集经理与项目经理的区别

项目经理未来的发展是什么?很多人经常问,专业的路可以是项目集,项目组合经理,也可以是PMO等等。为什么项目集经理,项目组合经理就挣得比较多呢?今天为大家一一揭秘! 项目经理、项目集经理和项目…

【2023年11月第四版教材】《第5章-信息系统工程(合集篇)》

《第5章-信息系统工程(合集篇)》 章节说明1 软件工程1.1 架构设计1.2 需求分析1.3 软件设计1.4 软件实现[补充第三版教材内容] 1.5 部署交付 2 数据工程2.1 数据建模2.2 数据标准化2.3 数据运维2.4 数据开发利用2.5 数据库安全 3 …

攻防世界-backup

原题 解题思路 备份文件后缀大多是bak、git、svn、swp等,尝试index.php.bak就有文件下载了:

文件型数据库Derby操作示例

1.下载db-derby-10.14.2.0-bin.zip 2.启动数据库,两种方式 1) 可执行程序 Windows可以运行ij.bat, Linux可以运行ij Ij.bat, ij在bin目录里 2)通过执行jar包形式启动 Derbyrun.jar在lib目录里 执行Java -jar derbyrun.jar ij 启动 2. 连接数据库 …

除了提升编码能力,养成这4个工作习惯,让你成为更优秀的前端开发者

如果你想成为一名优秀的前端开发者,你需要拥有不仅仅是技术知识。如今,由于谷歌和其他资源的存在,获取技术知识比以前更容易了。而真正能够产生差异的是习惯。就像心理强度对于个人成长很重要一样,有些习惯可以让你成为一个更有效…

七夕最强Python表白代码来了

点击上方Python小二,选择星标公众号 干货速达,不迷路 快到七夕了,大家都懂,这里不过多解释了,送大家几段节日专属Python代码。 玫瑰 毫无疑问,玫瑰一直都是七夕、520......这类节日的专属,带文字…

最长公共子序列——力扣1143

解法:动态规划 int longestCommonSubsequence(string text1, string text2){int m=text1.size(), n=text2.size

高等数学上册 第九章 多元函数微分法及其应用 知识点总结

多元函数微分法及其应用 ( 1 )多元函数的极限: 用“ ε − δ ”语言描述,二元函数的极限叫二重极限 二重极限存在: { 1 、 P ( x , y ) 一定要以任何方式趋于 ( x 0 , y 0 ) 时, f ( x , y ) 无限趋近于 A…

flutter:webview_flutter和flutter_inappwebview的简单使用

前言 最近在研究如何在应用程序中嵌入Web视图,发现有两个库不错。 一个是官方维护、一个是第三方维护。因为没说特别的需求,就使用了官方库,实现一些简单功能是完全ok的 webview_flutter 不建议使用,因为效果不怎么样&#xf…

wps设置其中几页为横版

问题:写文档的时候,有些表格列数太多,纵向显示内容不完整,可以给它改成横向显示。 将鼠标放在表格上一页的底部,点击‘插入-分页-下一页分节符’。 将鼠标放在表格页面的底部,点击‘插入-分页-下一页分节符…