Spring MVC异常处理
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的异常处理机制为主。
相关文章:
Spring MVC异常处理
Spring MVC异常处理 Spring MVC异常处理机制HandlerExceptionResolver的实现类DefaultHandlerExceptionResolver实现类DefaultHandlerExceptionResolver 在Controller的请求处理方法中手动使用try…catch块捕捉异常,当捕捉到指定的异常时,系统返回对应的…...
Centos7安装docker后默认开启docker0的网卡|卸载默认网卡
docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六):docker 网络及数据卷设置 docker实战(七):docker 性质及版本选择 认知升…...
04_Redis与mysql数据双写一致性案例
04——redis与mysql数据双写一致性 一、canal 是什么 canal[ka’nel,中文翻译为水道/管道/沟渠/运河,主要用途是用于MySQL数据库增量日志数据的订阅、消费和解析,是阿里巴巴开发并开源的,采用Java语言开发; 历史背景是早期阿里巴巴因为杭州和…...
vue的开发者工具下载『保姆级别』
1.先进官网 极简插件_Chrome扩展插件商店_优质crx应用下载 (zzzmh.cn) 2.搜索vue devtools,点击进去 3.下载插件 4.下载到文件下你自己的文件下:我的是下载到E盘下。 5.压缩到当前目录下 6.电脑进入拓展程序(不同的浏览器操作不同ÿ…...
vue的scrollTop手机环境设置值失效,本地正常可以赋值
获取div盒子ref或者document获取都行 监听方法 一定要加this.$nexttick,在本地测试只用nexttick是没有问题的,但是到手机测试就不行了,原因是因为手机渲染比本地更快,所以结合setTimeout使用 如果有更好的处理方法,恳请大佬指点一…...
[前端系列第7弹]Vue:一个渐进式的 JavaScript 框架
Vue 是一个用于构建用户界面的 JavaScript 框架,它具有以下特点: 渐进式:Vue 可以根据不同的使用场景,灵活地选择使用库或者框架的方式,从而实现渐进式的开发。响应式:Vue 通过数据绑定和虚拟 DOM 技术&am…...
C#键盘按键对应Keys类大全
...
SpringBoot 学习(03): 弱语言的注解和SpringBoot注解的异同
弱语言代表:Hyperf,一个基于 PHP Swoole 扩展的常驻内存框架 注解概念的举例说明; 说白了就是,你当领导,破烂事让秘书帮你去安排,你只需要批注一下,例如下周要举办一场活动,秘书将方…...
CloudQuery:更好地管理你的 OceanBase 数据库
前言:作为 OceanBase 的生态合作伙伴,CloudQuery(简称“CQ”) 最新发布的社区版 2.2.0 新增了 OceanBase 数据库,为企业使用 OceanBase 数据库提供全面的支持。包括连接与认证、查询与分析、数据安全与权限管理&#x…...
php的password_verify 和 password_hash密码验证
password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)。 当前支持的算法: PASSWORD_DEFAULT - 使用 bcrypt 算法 (PHP 5.5.0 默认)。 注意,该常量会随着 PHP 加入更新更高强度的算法而改变。 所以,使用此常量生成结果的长度将在未…...
JAVA免杀学习与实验
1 认识Webshell 创建一个JSP文件: <% page import"java.io.InputStream" %> <% page import"java.io.BufferedReader" %> <% page import"java.io.InputStreamReader" %> <% page language"java" p…...
Apche Kafka + Spring的消息监听容器
目录 一、消息的接收1.1、消息监听器 二、消息监听容器2.1、 实现方法2.1.1、KafkaMessageListenerContainer2.1.1.1、 基本概念2.1.1.2、如何使用 KafkaMessageListenerContainer 2.1.2、ConcurrentMessageListenerContainer 三、偏移 四、监听器容器自动启动 一、消息的接收 …...
[JavaWeb]【五】web后端开发-Tomcat SpringBoot解析
目录 一 介绍Tomcat 二 基本使用 2.1 解压绿色版 2.2 启动TOMCAT 2.3 关闭TOMCAT 2.4 常见问题 2.5 修改端口号 2.6 部署应用程序 三 SpringBootWeb入门程序解析 前言:tomcat与SpringBoot解析 一 介绍Tomcat 二 基本使用 2.1 解压绿色版 2.2 启动TOMCAT 2…...
css 用过渡实现,鼠标离开li时,背景色缓慢消息的样式
要实现鼠标悬停时背景颜色变为黄色,鼠标离开时背景颜色慢慢消失并变回白色的效果, 可以使用CSS的过渡(transition)属性 li {background: #fff;color: #000;transition: background 0.5s ease-out; }li:hover {background: #fbb31…...
pytorch 线性层Linear详解
线性层就是全连接层,以一个输入特征数为2,输出特征数为3的线性层为例,其网络结构如下图所示: 输入输出数据的关系如下: 写成矩阵的形式就是: 下面通过代码进行验证: import torch.nn as nn …...
LeetCode 833. 字符串中的查找与替换
2235. 两整数相加 添加链接描述 给你两个整数 num1 和 num2,返回这两个整数的和。 示例 1: 输入:num1 12, num2 5 输出:17 解释:num1 是 12,num2 是 5 ,它们的和是 12 5 17 ,…...
Oracle故障案例之-19C时区补丁DSTV38更新
📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA工作经验 一位上进心十足的【大数据领域博主】!😜ὡ…...
设计模式之组合模式(Composite)的C++实现
1、组合模式的提出 在软件开发过程中,使用者Client过多依赖所操作对象内部的实现结构,如果对象内部的实现结构频繁发生变化,则使用者的代码结构将要频繁地修改,不利于代码地维护和扩展性;组合模式可以解决此类问题。组…...
mongo的include方法踩坑
前言 又是不认识自己代码的一天 问题 Query query new Query(); if(StringUtils.isNotNull(reqVO.getFieldLimitList()) && reqVO.getFieldLimitList().size() > 0){for(String filedName : reqVO.getFieldLimitList()){query.fields().include(filedName);} }看到…...
阿里云无影云电脑/云桌面收费价格表_使用申请方法
阿里云无影云电脑配置具体收费价格表,4核8G企业办公型云电脑可以免费使用3个月,无影云电脑地域不同价格不同,无影云电脑费用是由云桌面配置、云盘、互联网访问带宽、AD Connector 、桌面组共用桌面session 等费用组成,阿里云百科分…...
别再让图片拖慢你的Unity项目!手把手教你用AssetPostprocessor搞定尺寸与压缩
Unity项目性能优化:智能图片处理全攻略 1. 为什么图片处理对Unity项目至关重要 在Unity开发过程中,图片资源往往是项目体积膨胀的罪魁祸首。一个中型项目可能包含数千张纹理,如果不加控制,这些资源会迅速吞噬内存和存储空间。更糟…...
Hummingbot自动化交易框架:从原理到实战的量化交易指南
1. 项目概述:一个为专业交易者打造的自动化交易框架如果你在加密货币交易领域摸爬滚打过一段时间,一定会对“手动盯盘”的疲惫和“情绪化操作”的代价深有体会。市场24/7运转,机会转瞬即逝,而人的精力终究有限。这正是我最初接触并…...
契约驱动开发:用AI守护代码质量,告别技术债
1. 项目概述:从“技术债”到“可持续开发”的范式转变 如果你和我一样,长期在技术一线摸爬滚打,那你一定对“技术债”这个词又爱又恨。爱它,是因为它给了我们一个快速交付的借口;恨它,是因为它总在项目最脆…...
中小团队如何利用Taotoken统一管理多个项目的AI调用成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 中小团队如何利用Taotoken统一管理多个项目的AI调用成本 对于同时推进多个AI应用开发项目的中小型技术团队而言,管理分…...
GoMCP框架:用Go快速构建AI工具集成服务器
1. 项目概述:GoMCP,一个为Go语言打造的MCP服务器框架如果你正在用Go语言开发AI应用,并且想让你的Claude Desktop、Cursor或者VS Code Copilot能够调用你写的工具、读取你的数据源,那么你很可能已经接触过Model Context Protocol&a…...
**《5月给3岁孩子准备入园物品9月能适应幼儿园吗?FAQ全解析》**
“5月准备入园物品,9月孩子就能适应幼儿园?看似简单的准备,背后藏着大学问。”对于家长来说,孩子能否顺利适应幼儿园是心头大事。提前准备入园物品是重要一步,但适应幼儿园还涉及多方面因素。以下是关于孩子入园适应相…...
小米Agent岗二面:你们 RAG 知识库上线之后,文档更新了怎么办?
👔面试官:你们 RAG 知识库上线之后,文档更新了怎么办?总不能每次改个文档就把整个知识库重建一遍吧。 🙋♂️我:可以直接找到变了的那个 chunk,更新它的向量就行了。 👔面试官&a…...
维他动力获5亿Pre-A轮启动人形研发;优必选与日立达成合作人形机器人赋能制造; 前小米高管创业工业通用具身大脑小雨智造获B+轮融资
1. 维他动力获5亿Pre-A轮启动人形研发牛喀网获悉,Vbot维他动力正式完成近5亿元Pre-A轮融资,创下当前消费级具身智能领域的最大单笔融资纪录,本轮由东方嘉富、华泰紫金、复星锐正联合领投,上汽旗下尚颀资本等机构参投。技术层面&am…...
Funannotate数据库安装终极指南:解决HPC环境中的常见问题
Funannotate数据库安装终极指南:解决HPC环境中的常见问题 【免费下载链接】funannotate Eukaryotic Genome Annotation Pipeline 项目地址: https://gitcode.com/gh_mirrors/fu/funannotate Funannotate作为一款专业的真核生物基因组注释流程工具,…...
ARM ETE Trace ID寄存器详解与应用
1. ARM ETE Trace ID寄存器概述在ARM架构的嵌入式调试系统中,Trace ID寄存器(TRCIDR)是嵌入式跟踪宏单元(ETE)的核心组件。这些寄存器提供了非侵入式的实时程序流分析能力,对于芯片验证、性能优化和系统调试具有不可替代的价值。ETE的Trace ID寄存器从TR…...
