当前位置: 首页 > news >正文

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.电脑进入拓展程序(不同的浏览器操作不同&#xff…...

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文件&#xff1a; <% 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入门程序解析 前言&#xff1a;tomcat与SpringBoot解析 一 介绍Tomcat 二 基本使用 2.1 解压绿色版 2.2 启动TOMCAT 2…...

css 用过渡实现,鼠标离开li时,背景色缓慢消息的样式

要实现鼠标悬停时背景颜色变为黄色&#xff0c;鼠标离开时背景颜色慢慢消失并变回白色的效果&#xff0c; 可以使用CSS的过渡&#xff08;transition&#xff09;属性 li {background: #fff;color: #000;transition: background 0.5s ease-out; }li:hover {background: #fbb31…...

pytorch 线性层Linear详解

线性层就是全连接层&#xff0c;以一个输入特征数为2&#xff0c;输出特征数为3的线性层为例&#xff0c;其网络结构如下图所示&#xff1a; 输入输出数据的关系如下&#xff1a; 写成矩阵的形式就是&#xff1a; 下面通过代码进行验证&#xff1a; import torch.nn as nn …...

LeetCode 833. 字符串中的查找与替换

2235. 两整数相加 添加链接描述 给你两个整数 num1 和 num2&#xff0c;返回这两个整数的和。 示例 1&#xff1a; 输入&#xff1a;num1 12, num2 5 输出&#xff1a;17 解释&#xff1a;num1 是 12&#xff0c;num2 是 5 &#xff0c;它们的和是 12 5 17 &#xff0c;…...

Oracle故障案例之-19C时区补丁DSTV38更新

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61…...

设计模式之组合模式(Composite)的C++实现

1、组合模式的提出 在软件开发过程中&#xff0c;使用者Client过多依赖所操作对象内部的实现结构&#xff0c;如果对象内部的实现结构频繁发生变化&#xff0c;则使用者的代码结构将要频繁地修改&#xff0c;不利于代码地维护和扩展性&#xff1b;组合模式可以解决此类问题。组…...

mongo的include方法踩坑

前言 又是不认识自己代码的一天 问题 Query query new Query(); if(StringUtils.isNotNull(reqVO.getFieldLimitList()) && reqVO.getFieldLimitList().size() > 0){for(String filedName : reqVO.getFieldLimitList()){query.fields().include(filedName);} }看到…...

阿里云无影云电脑/云桌面收费价格表_使用申请方法

阿里云无影云电脑配置具体收费价格表&#xff0c;4核8G企业办公型云电脑可以免费使用3个月&#xff0c;无影云电脑地域不同价格不同&#xff0c;无影云电脑费用是由云桌面配置、云盘、互联网访问带宽、AD Connector 、桌面组共用桌面session 等费用组成&#xff0c;阿里云百科分…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...