Spring MVC 完整生命周期和异常处理流程图

先要明白
在这里插入图片描述

// 1. 用户发来请求: localhost:8080/user/1

// 2. 处理器映射器(HandlerMapping)的工作
// 它会找到对应的Controller和方法
@GetMapping("/user/{id}")  
public User getUser(@PathVariable Long id) {
    return userService.getById(id);
}

// 3. 处理器适配器(HandlerAdapter)的工作
// - 把URL中的"1"转成Long类型的1 (类型转换)
// - 检查id是否为空、是否是正数 (数据验证)
// - 把转换好的参数传给controller方法 (参数解析)
客户端/浏览器 前端控制器 (DispatcherServlet) 处理器映射器 (HandlerMapping) 处理器适配器 (HandlerAdapter) 控制器 (Controller) 服务层 (Service) 异常通知器 (@RestControllerAdvice) 异常解析器 (HandlerExceptionResolver) 前端控制器初始化 1. initMultipartResolver() 初始化文件上传解析器 2. initLocaleResolver() 初始化地区解析器 3. initThemeResolver() 初始化主题解析器 4. initHandlerMappings() 初始化处理器映射器 5. initHandlerAdapters() 初始化处理器适配器 6. initHandlerExceptionResolvers() 初始化异常解析器 请求处理阶段 1. 发送HTTP请求 (例如:POST /serve/onSale/1) 2. getHandler() 查找处理器 根据URL匹配HandlerMapping 返回HandlerExecutionChain 返回处理器执行链 3. getHandlerAdapter() 获取处理器适配器 适配器负责: 1.参数解析 2.类型转换 3.数据验证 返回适配器 业务处理阶段 4. handle(request, response, handler) 调用控制器方法 调用服务层方法 返回处理结果 返回ModelAndView 返回ModelAndView 业务处理出现异常 可能抛出: 1. ForbiddenOperationException 2. CommonException 3. 其他异常 异常被@RestControllerAdvice捕获 委托给异常解析器处理 异常解析过程: 1. 判断异常类型 2. 选择处理策略 3. 转换为统一响应 处理FeignException 处理CommonException 处理普通Exception alt [Feign调用异常] [自定义业务异常] [其他异常] 返回处理结果 返回错误响应 alt [正常业务流程] [异常流程] 响应处理阶段 processDispatchResult() 处理ModelAndView 返回处理结果 处理错误视图 返回统一错误格式 alt [成功响应] [错误响应] 核心组件说明: 1. DispatcherServlet:Spring MVC的核心,统一的请求处理入口 2. HandlerMapping:负责URL与处理器的映射 3. HandlerAdapter:负责适配不同类型的处理器 4. Controller:处理具体的业务逻辑 5. @RestControllerAdvice:统一的异常处理切面 6. HandlerExceptionResolver:负责具体的异常处理策略 客户端/浏览器 前端控制器 (DispatcherServlet) 处理器映射器 (HandlerMapping) 处理器适配器 (HandlerAdapter) 控制器 (Controller) 服务层 (Service) 异常通知器 (@RestControllerAdvice) 异常解析器 (HandlerExceptionResolver)
重要说明
响应处理阶段
异常处理阶段
业务处理阶段
请求处理阶段
前端控制器初始化阶段
找到
未找到
支持
不支持
成功
失败
Feign异常
业务异常
其他异常
前端控制器
DispatcherServlet
处理器映射器
HandlerMapping
处理器适配器
HandlerAdapter
异常通知器
@RestControllerAdvice
异常解析器
HandlerExceptionResolver
构建响应对象
返回HTTP响应
检查异常类型
FeignException处理
CommonException处理
Exception处理
是否内部调用
内部异常处理
外部异常处理
设置异常头信息
构建错误响应
调用服务层方法
是否成功
返回处理结果
抛出异常
查找处理器
接收HTTP请求
获取处理器适配器
返回404
适配器是否支持
调用控制器方法
返回错误信息
初始化文件上传解析器
initMultipartResolver
前端控制器初始化
初始化地区解析器
initLocaleResolver
初始化主题解析器
initThemeResolver
初始化处理器映射器
initHandlerMappings
初始化处理器适配器
initHandlerAdapters
初始化异常解析器
initHandlerExceptionResolvers
开始
结束

我用生活中的例子解释 @RestControllerAdvice 的工作原理:
想象一个大型商场的客服中心:

  1. DispatcherServlet就像商场的总服务台
  • 负责接收所有顾客的需求并分配给相应的专柜处理
  1. @RestControllerAdvice就像商场的客服中心
  • 设立在商场的一个统一位置
  • 专门处理各个专柜出现的问题和投诉

举个具体场景:

顾客在商场购物的流程:

1. 正常流程:
顾客 -> 总服务台(DispatcherServlet) -> 专柜(Controller) -> 购买商品

2. 出现问题时:
专柜(Controller)出现问题 -> 客服中心(@RestControllerAdvice)接手处理 -> 给顾客一个合理解释

用代码表示:

// 这就像设立一个统一的客服中心
@RestControllerAdvice
public class GlobalExceptionHandler {
    
    // 这就像专门处理"商品缺货"的客服人员
    @ExceptionHandler(ProductOutOfStockException.class)
    public ResponseEntity<String> handleOutOfStock(ProductOutOfStockException e) {
        // 返回友好提示:"非常抱歉,商品暂时缺货,预计3天后到货"
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                           .body("商品暂时缺货,预计3天后到货");
    }
    
    // 这就像处理"商品价格异常"的客服人员
    @ExceptionHandler(PriceException.class)
    public ResponseEntity<String> handlePriceError(PriceException e) {
        // 返回友好提示:"价格显示异常,请稍后重试"
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                           .body("价格显示异常,请稍后重试");
    }
}

为什么能拦截异常?
就像商场里:

  1. 所有专柜都在商场里面
  2. 客服中心在商场的入口处
  3. 一旦专柜出问题,就会按照商场规定,统一转到客服中心处理

在Spring中:

  1. DispatcherServlet(总服务台)知道有这个@RestControllerAdvice(客服中心)的存在
  2. 当Controller(专柜)抛出异常时
  3. DispatcherServlet就会把异常转给@RestControllerAdvice处理

关键点:

  • 它不是拦截,而是异常发生后的统一处理
  • Spring框架帮我们做了这个转发操作
  • 这样我们就不用在每个Controller里写重复的异常处理代码
客户端 DispatcherServlet Controller @RestControllerAdvice 异常通知类 @ExceptionHandler 异常处理方法 正常请求流程 1. 发送HTTP请求 2. 转发到Controller 异常发生和处理流程 3. 业务处理过程中抛出异常 @RestControllerAdvice的作用 1. 是@ControllerAdvice的特殊形式 2. 会自动扫描所有Controller 3. 集中处理所有异常 4. 异常被@RestControllerAdvice捕获 @ExceptionHandler的作用 1. 指定要处理的异常类型 2. 根据异常类型匹配处理方法 3. 将异常转换为友好响应 5. 根据异常类型找到对应的处理方法 处理微服务调用异常 处理业务异常 处理未知异常 alt [FeignExcept- ion异常] [CommonExc- eption异常] [其他Exceptio- n] 响应处理 6. 返回处理后的Result对象 7. 转换为HTTP响应返回 重要说明: 1. @RestControllerAdvice相当于异常的"统一接待处" 2. @ExceptionHandler相当于不同类型异常的"专门处理窗口" 3. 整个过程自动完成,使异常处理从业务代码中解耦 客户端 DispatcherServlet Controller @RestControllerAdvice 异常通知类 @ExceptionHandler 异常处理方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop生态圈框架部署(四)- Hadoop完全分布式部署

文章目录 前言一、Hadoop完全分布式部署&#xff08;手动部署&#xff09;1. 下载hadoop2. 上传安装包2. 解压hadoop安装包3. 配置hadoop配置文件3.1 虚拟机hadoop1修改hadoop配置文件3.1.1 修改 hadoop-env.sh 配置文件3.3.2 修改 core-site.xml 配置文件3.3.3 修改 hdfs-site…

【智能算法应用】天鹰优化算法求解二维路径规划问题

摘要 路径规划问题在机器人和无人机导航中起着关键作用。本文提出了一种基于天鹰优化算法的二维路径规划方法。天鹰优化算法&#xff08;Eagle Strategy Optimization, ESO&#xff09;通过模拟天鹰的捕猎行为&#xff0c;寻找最优路径。实验结果显示&#xff0c;该算法能够有…

数据结构之二叉树——堆 详解(含代码实现)

1.堆 如果有一个关键码的集合 K { &#xff0c; &#xff0c; &#xff0c; … &#xff0c;}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;则称为小堆( 或大堆 ) 。将根节点最大的堆叫做最大堆或大根堆&#xff0c;根节点最小的…

【机器学习】25. 聚类-DBSCAN(density base)

聚类-DBSCAN-density base 1. 介绍2. 实现案例计算 3. K-dist4. 变化密度5. 优缺点 1. 介绍 DBSCAN – Density-Based Spatial Clustering of Applications with Noise 与K-Means查找圆形簇相比&#xff0c;DBSCAN可以查找任意形状和复杂形状的簇&#xff0c;如S形、椭圆、半圆…

MongoDB 8.0.3版本安装教程

MongoDB 8.0.3版本安装教程 一、下载安装 1.进入官网 2.选择社区版 3.点击下载 4.下载完成后点击安装 5.同意协议&#xff0c;下一步 6.选择第二个Custon&#xff0c;自定义安装 7.选择安装路径 &#xff01;记住安装路径 8.默认&#xff0c;下一步 9.取…

怎么做才能降低APP用户的卸载率?

常年困扰 App 开发者的始终是一个问题&#xff1a;怎么做才能降低用户卸载率呢&#xff1f; 不要慌&#xff0c;今天这篇文章里&#xff0c;你就会找到解决方案啦。首先请记住&#xff1a; 每个 App 都是有自己独立个性的&#xff0c;所以没有一个通用的公式能让大家套用。 还…

elasticsearch 8.x 插件安装(三)之拼音插件

elasticsearch 8.x 插件安装&#xff08;三&#xff09;之拼音插件 elasticsearch插件安装合集 elasticsearch插件安装&#xff08;一&#xff09;之ik分词器安装&#xff08;含MySQL更新&#xff09; elasticsearch 8.x插件&#xff08;二&#xff09;之同义词安装如何解决…

CSP-J2024入门级T3:小木棍

题目链接 CSP-J2024T3:小木棍 题目描述 小 S 喜欢收集小木棍。在收集了 n n n 根长度相等的小木棍之后,他闲来无事,便用它们拼起了数字。用小木棍拼每种数字的方法如下图所示。 现在小 S 希望拼出一个正整数,满足如下条件: 拼出这个数恰好使用

Python小游戏19——滑雪小游戏

运行效果 python代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("滑雪小游戏") # 定义颜色 WH…

哪个牌子的宠物空气净化器好?口碑好的宠物空气净化器推荐!

哪个牌子的宠物空气净化器好&#xff1f;作为一名家电测评博主&#xff0c;我发现市面上宠物空气净化器的牌子越来越多了&#xff0c;很多厂家都看中了宠物行业的红利&#xff0c;想来分一杯羹&#xff0c;这就导致很多技术不成熟的产品流入了市场。今年我测试了50多台宠物空气…

【Vue3.js】计算属性监视属性的深度解析

&#x1f9d1;‍&#x1f4bc; 一名茫茫大海中沉浮的小小程序员&#x1f36c; &#x1f449; 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️&#xff01; &#x1f4d1; 目录 &#x1f53d; 前言1️⃣ 计算属性概述2️⃣ 监视属性概述3️⃣ 计算属性与监视属性的对比…

[SAP ABAP] 在选择屏幕上的标准工具栏上增加自定义按钮

SAP系统的选择屏幕的标准工具栏上预先定义了5个按钮&#xff0c;对应的功能码是FC01、FC02、FC03、FC04、FC05&#xff0c;该功能码默认是不激活的。用户可以使用以下代码来激活这5个按钮 SELECTION-SCREEN FUNCTION KEY i. 提示Tips&#xff1a;这里的 i 必须是整数1-5&…

SIwave:释放 DCIR 求解器的强大功能

SIwave 是一种电源完整性和信号完整性工具。本文讨论了 DCIR 是电源完整性求解器之一。 DCIR 对于研究 powerplane 配电网络 PDN 的电压和电流分布是必要的。该求解器可计算任何电源层中的电压降、接地层中的电压上升、电流分布、每个过孔中的电流&#xff0c;检测任何过孔中的…

【论文笔记】Token Turing Machines

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Token Turing Machines 作…

2. Flink快速上手

文章目录 1. 环境准备1.1 系统环境1.2 安装配置Java 8和Scala 2.121.3 使用集成开发环境IntelliJ IDEA1.4 安装插件2. 创建项目2.1 创建工程2.1.1 创建Maven项目2.1.2 设置项目基本信息2.1.3 生成项目基本框架2.2 添加项目依赖2.2.1 添加Flink相关依赖2.2.2 添加slf4j-nop依赖2…

XHCI 1.2b 规范摘要(九)

系列文章目录 XHCI 1.2b 规范摘要&#xff08;一&#xff09; XHCI 1.2b 规范摘要&#xff08;二&#xff09; XHCI 1.2b 规范摘要&#xff08;三&#xff09; XHCI 1.2b 规范摘要&#xff08;四&#xff09; XHCI 1.2b 规范摘要&#xff08;五&#xff09; XHCI 1.2b 规范摘要…

【JavaEE初阶】网络原理(5)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 路由选择 数据链路层>以太网 MTU mac地址和IP地址的区别 空间范围不同 应用范围不同 ARP协议/ARP数据包 DNS(域名解析系统) 路由选择 每个路由器,无法知道整个网络…

图书管理系统汇报

【1A536】图书管理系统汇报 项目介绍1.用户登录注册功能1. 1用户角色管理2.图书管理功能2.1 添加图书2.2 编辑图书2.3 删除图书 3.图书搜索和筛选3.1 图书搜索3.2 图书筛选 4.图书借阅、图书归还4.1 图书借阅4.2 图书归还 5.用户信息管理5.1上传头像5.2修改头像5.3 修改密码 项…

清晰易懂的JavaScript进阶部分——DOM操作 (节点获取,节点属性修改,节点创建与插入,CSS样式的修改)

DOM操作&#xff08;Document Object Model 文档对象模型&#xff09;指的是通过JavaScript来操作网页的结构和内容。DOM提供了一种以文档树形式表示HTML或XML文档的方式&#xff0c;可以使用JavaScript来访问和修改网页的元素、属性和文本内容&#xff0c;且提供了一系列的函数…

服务器虚拟化

前言 服务器虚拟化是一种技术&#xff0c;它通过将一台物理服务器的软件环境分割成多个独立分区&#xff0c;使每个分区都能模拟出一台完整的虚拟服务器。这种技术利用虚拟化技术充分发挥服务器的硬件性能&#xff0c;提高运营效率&#xff0c;节约能源并降低经济成本。 通过…