【老王读SpringMVC-7】Controller method 的异常返回值处理

news2024/11/16 7:33:41

通过前面分析 Controller method的执行过程,我们知道, handler method 的执行是通过调用 ServletInvocableHandlerMethod#invokeAndHandle()
执行过程中的异常全部会往上抛出,然后由 DispatcherServlet 来处理。
DispatcherServlet 会调用 HandlerExceptionResolver 来对异常进行处理。

processDispatchResult

可以看到,如果 handler method 执行过程中出现异常的话,会调用 DispatcherServlet#processHandlerException() 来处理,接着会通过 HandlerExceptionResolver 来处理异常,最终解析成一个 ModelAndView 来进行处理。

HandlerExceptionResolver

HandlerExceptionResolver 是用来处理 handler method 执行过程中抛出的异常的。
HandlerExceptionResolver 会将异常处理成一个 ModelAndView 进行返回,最终交回给 DispatcherServlet 来进行处理。

类图如下:
HandlerExceptionResolver

在异常处理处打个断点:
HandlerExceptionResolvers

可以看到, SprintBoot 使用的异常解析器是:
1、ExceptionHandlerExceptionResolver – 通过 @ExceptionHandler 方法来解析异常
2、ResponseStatusExceptionResolver – 处理 @ResponseStatus 映射异常状态
3、DefaultHandlerExceptionResolver – 默认实现,处理 MVC 框架内部异常

其中,我们最常用的异常解析器是 ExceptionHandlerExceptionResolver

ExceptionHandlerExceptionResolver

ExceptionHandlerExceptionResolver 通过 @ExceptionHandler 标记的方法解析异常。
它支持通过配置 ArgumentResolverReturnValueHandler 来添加对自定义参数和返回值类型的支持。

getExceptionHandlerMethod

  • 寻找 ExceptionHandler method 的过程如下:
    1、先从 Controller 类和父类中寻找带有 @ExceptionHandler 的方法
    2、如果 Controller 类里面没有,就找被 @ControllerAdvice 标记的全局的 @ExceptionHandler 方法

最终,会将匹配的 ExceptionHandler method 包装成一个 ServletInvocableHandlerMethod 返回。

是不是对 ServletInvocableHandlerMethod 有点眼熟?
是的,就是前面在讲执行 handler method 的时候,最终也是将 handler method 包装成了一个 ServletInvocableHandlerMethod,然后通过 ServletInvocableHandlerMethod#invokeAndHandle() 来执行的。
这样包装的好处是,它里面可以通过 argumentResolver 来对方法入参进行解析,同时能通过 returnValueHandler 来对返回值进行处理。

所以,我们也可以在 @ExceptionHandler 方法 上使用 @ResponseBody 等注解,或者让 ExceptionHandler method 返回 ModelAndView 等对象,最终,都会通过 returnValueHandler 来进行统一处理。

补充:ControllerAdvice

@ControllerAdvice 的作用是: 为声明 @ExceptionHandler、@InitBinder 或 @ModelAttribute 方法跨多个 @Controller 类共享的类专门化的 @Component。
所以,@ControllerAdvice 不仅可以用于统一异常的处理,还可以用来对请求入参的统一处理。

注意: @ControllerAdvice 本身就是一个 @Component

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
    
  @AliasFor("basePackages")
  String[] value() default {};

  /**
   * 将 ControllerAdvice 作用于 basePackages 包或者子包里的 Controller 类
   */
  @AliasFor("value")
  String[] basePackages() default {};

  /**
   * 用于指定 basePackages 参数的类型安全的替代方案。
   */
  Class<?>[] basePackageClasses() default {};

  /**
   * 将 ControllerAdvice 作用于指定类型的 Controller
   */
  Class<?>[] assignableTypes() default {};

  /**
   * 将 ControllerAdvice 作用于指定注解标记的 Controller。比如:@RestContrroller
   */
  Class<? extends Annotation>[] annotations() default {};

}

@ControllerAdvice 标记的 bean 最后会被包装成一个 ControllerAdviceBean

小结

Controller method 抛出的异常,最终会被 DispatcherServlet#processHandlerException() 来统一处理。
最终是通过 HandlerExceptionResolver 来进行处理,它会将异常解析成一个 ModelAndView 对象,再交回给 DispatcherServlet 来统一进行视图解析。
所以,不管 handler method 是正常返回,还是异常返回,最终都会将返回结果包装成一个 ModelAndView 对象(或者 null),然后由 DispatcherServlet 来统一处理。

HandlerExceptionResolver 最常用的实现类是 ExceptionHandlerExceptionResolver,它支持通过 @ExceptionHandler 标记的方法解析异常。

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

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

相关文章

MATLAB第十章_图像处理算法

目录 图像处理算法 图像处理基础 图像处理函数 默认显示方式 添加颜色条 显示多帧图像 显示动画 三维材质图像 图像的直方图 灰度变换 均衡直方图 图像处理应用 图像增强 图像重建 图像变换 图像压缩 图像分割 图像边缘检测 图像识别 图像处理算法 图像处理…

化繁为简,在线表单工具值得一试!

在办公职场中&#xff0c;经常听到不少人抱怨&#xff1a;表单制作效率低、数据整理麻烦等&#xff0c;这个时候不少办公职员是多么希望能有一整套完善的表单制作工具来满足办公需求&#xff0c;快速提升办公协作效率。不要着急&#xff0c;如今是产业分工新时代&#xff0c;在…

Linux终端环境下的浏览器Lynx和Carbonyl 的基本使用方法

一、Carbonyl 是基于Chromium开发的运行于终端下的现代版浏览器&#xff0c;比Lynx的功能更好&#xff0c;目前尚在滚动开发过程中&#xff0c;但也基本可以用了。 1. 2安装非常简单&#xff0c;下载Binaries&#xff0c;Docker&#xff0c;nmp install, 都可以。 注意&#…

智能电表怎么实现远程抄表

智能电表是一种新型的电表&#xff0c;它可以实现远程抄表的功能。智能电表的远程抄表是通过无线网络或有线网络来实现的&#xff0c;这使得抄表变得更加方便和快捷。本文将介绍智能电表如何实现远程抄表的技术原理和实现方法。 一、技术原理 智能电表的远程抄表是通过将电表与…

定了 香港新政6月1日生效 散户交易加密货币正式合法化!

如今&#xff0c;香港虚拟资产交易的各项准备工作已准备就绪。5月23日&#xff0c;香港证监会&#xff08;SFC&#xff09;详细介绍了各界参与虚拟资产交易的咨询总结文件&#xff0c;宣布《适用于虚拟资产交易平台营运者的指引》将于2023年6月1日生效。 SFC行政总裁梁凤仪表示…

2023 最全 Java 面试八股(涵盖所有 Java 核心面试知识点),立刻收藏

2022 已成为过去式&#xff0c;不论这一年好与坏&#xff0c;我们都需要抓住新一年的机会&#xff0c;跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01;为了帮大家节约时间&#xff0c;给大家搞来了 …

2023 华为 Datacom-HCIE 题库 02--含解析

单选题 1.[试题编号&#xff1a;189785] &#xff08;单选题&#xff09;如图所示&#xff0c;VTEP1上在BD20域内开启了ARP广播抑制功能&#xff0c;并且VTEP1通过 BGP EVPN路由学习到了PC2的ARP信息&#xff0c;则PC1发送的针对PC2的ARP请求&#xff0c;VIEP1在转发给VIEP2时…

SpringCloud(23):Sentinel对Spring Cloud Gateway的支持

代码地址&#xff1a;https://download.csdn.net/download/u013938578/87767363 从 1.6.0 版本开始&#xff0c;Sentinel 提供了 Spring Cloud Gateway 的适配模块&#xff0c;可以提供两种资源维度的限流&#xff1a; route 维度&#xff1a;即在 Spring 配置文件中配置的路…

ChatGPT 入门教程||ChatGPT 应用场景1:让AI回答问题||ChatGPT应用场景2:基于已有的示例回答

ChatGPT 应用场景1&#xff1a;让AI回答问题 这个场景应该是使用 AI 产品最常见的方法。以 ChatGPT 为例&#xff0c;一般就是你提一个问题&#xff0c;ChatGPT 会给你答案&#xff0c;比如像这样&#xff1a; 在这个场景下&#xff0c;prompt 只要满足前面提到的基本原则&am…

通过opencv与神经网络对滑动验证码的一次深入学习

好久没写博客了&#xff0c;人到中年&#xff0c;有点儿犯懒。 从信息安全行业&#xff0c;又去了IT合规领域&#xff0c;与信息安全结合还是两手抓&#xff0c;两手都不硬。 由于工作原因&#xff0c;需要获取一个token来请求接口&#xff0c;奈何没有现成的接口&#xff0c…

记一次Android页面卡顿排查总结

背景&#xff1a;更新完gosdk&#xff08;端上的主要逻辑在go层完成&#xff09;后&#xff0c;冷启动时首页明显会卡一下 问题排查&#xff1a; 1、通过在application onCreate()中设置getMainLooper().setMessageLogging(new LxLogPainter());来查看耗时的日志&#xff0c;…

cfssl使用方法重新整理说明

下载安装&#xff1a; #下载cfssl、cfssl-json、cfssl-certinfo文件 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/bin/cfssljson wget https://pkg.cfssl.org/R1.2/cfssl-certinfo…

低代码开发:构建企业数字化生态系统的秘密武器!

目前&#xff0c;我们正处于数字化时代&#xff0c;而企业数字化早已是大势所趋&#xff0c;也是因为企业数字化转型是提高企业效率与竞争力的必经之路。 发展背景 近年来&#xff0c;伴随着人工智能、大数据分析技术、云计算等领域的迅速发展&#xff0c;不少企业开始正视数字…

【How to Design Translation Prompts for ChatGPT: An Empirical Study 论文略读】

How to Design Translation Prompts for ChatGPT: An Empirical Study 论文略读 INFORMATIONAbstract1 Introduction2 Background3 Experiments3.1 Prompt Design3.2 Experimental Setup3.2.1 Datasets3.2.2 Baselines and Evaluation Metrics 3.3 Multilingual Translation3.4…

接入支付宝沙箱环境

1、这里有几个重要数据要拿到&#xff0c;一个是支付宝的公钥和私钥&#xff0c;一个是支付的网关&#xff0c;和支付的APPID。这几个数据是要写到代码中的 官方手册&#xff1a;文档地址 1.1 配置沙箱应用环境 https://openhome.alipay.com/develop/sandbox/app 1.2 配置接口…

Git忽略文件的几种方法,以及.gitignore文件的忽略规则

Git忽略文件的几种方法&#xff0c;以及.gitignore文件的忽略规则 .gitignore文件定义Git全局的.gitignore文件Git 忽略规则Git忽略规则的优先级.gitignore文件忽略规则常用匹配示例&#xff1a; 关于.gitignore规则不生效的问题 不忽略没有后缀名的文件搜索电脑里没有后缀的文…

请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨)为什么很多人说崖山海战以后无中国

目录 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨) 为什么很多人说崖山海战以后无中国 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨) 以下是我对《unravel - TK from 凛冽时雨》这首歌词的理解&#xff1…

Hadoop部署伪分布式

伪分布式模式也是只需要一台机器&#xff0c;但是与本地模式的不同&#xff0c;伪分布式使用的是分布式的思想&#xff0c;具有完整的分布式文件存储和分布式计算的思想。只不过在进行存储和计算的时候涉及到的相关的守护进程都运行在同一台机器上&#xff0c;都是独立的Java进…

《LKD3粗读笔记》(15)进程地址空间

进程地址空间&#xff1a;内核除了管理本身的内存外&#xff0c;还必须管理用户空间中进程的内存&#xff0c;这个内存就是进程地址空间&#xff0c;即系统中每个用户空间进程所看到的内存。Linux操作系统采用虚拟内存技术&#xff0c;系统中的所有进程之间以虚拟方式共享内存。…

面试都不会造火箭,还想拿20k,过于离谱

前段时间公司缺人&#xff0c;也面了许多测试&#xff0c;一开始瞄准的就是中级水准&#xff0c;当然也没指望能来大牛&#xff0c;提供的薪资在15-20k这个范围&#xff0c;来面试的人有很多&#xff0c;但是平均水平真的让人很失望。看了简历很多上面都是写有4年工作经验&…