iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >常见的SpringMVC故障排查及解决方案是什么
  • 247
分享到

常见的SpringMVC故障排查及解决方案是什么

2023-06-05 04:06:52 247人浏览 独家记忆
摘要

本篇文章给大家分享的是有关常见的springMVC故障排查及解决方案是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、前言相信我们每个人在springmvc开发中,都遇到

本篇文章给大家分享的是有关常见的springMVC故障排查及解决方案是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一、前言

相信我们每个人在springmvc开发中,都遇到这样的问题:当我们的代码正常运行时,返回的数据是我们预期格式,比如JSON或xml形式,但是一旦出现了异常(比如:NPE或者数组越界等等),返回的内容确实服务端的异常堆栈信息,从而导致返回的数据不能使客户端正常解析; 很显然,这些并不是我们希望的结果。

我们知道,一个较为常见的系统,会涉及控制层,服务(业务)层、缓存层、存储层以及接口调用等,其中每一个环节都不可避免的会遇到各种不可预知的异常需要处理。如果每个步骤都单独try..catch会使系统显的很杂乱,可读性差,维护成本高;常见的方式就是,实现统一的异常处理,从而将各类异常从各个模块中解耦出来;

二、常见全局异常处理

在Spring中常见的全局异常处理,主要有三种:

(1)注解ExceptionHandler

(2)继承HandlerExceptionResolver接口

(3)注解ControllerAdvice

在后面的讲解中,主要以Http错误码:400(请求无效)和500(内部服务器错误)为例,先看一下测试代码以及没有任何处理的返回结果,如下:

常见的SpringMVC故障排查及解决方案是什么

(图1:测试代码)

常见的SpringMVC故障排查及解决方案是什么

(图2:没有异常的错误返回)

2.1 注解ExceptionHandler

注解ExceptionHandler作用对象为方法,最简单的使用方法就是放在controller文件中,详细的注解定义不再介绍。如果项目中有多个controller文件,通常可以在baseController中实现ExceptionHandler的异常处理,而各个contoller继承basecontroller从而达到统一异常处理的目的。因为比较常见,简单代码如下:

常见的SpringMVC故障排查及解决方案是什么

(图3:Controller中的ExceptionHandler使用)

在返回异常时,添加了所属的类名,便于大家记忆理解。运行看一下结果:

常见的SpringMVC故障排查及解决方案是什么

(图4:添加ExceptionHandler之后的结果) 

  • 优点:ExceptionHandler简单易懂,并且对于异常处理没有限定方法格式;

  • 缺点:由于ExceptionHandler仅作用于方法,对于多个controller的情况,仅为了一个方法,所有需要异常处理的controller都继承这个类,明明不相关的东西,强行关联,不太好。

2.2 注解ControllerAdvice

这里虽说是ControllerAdvice注解,其实是其与ExceptionHandler的组合使用。在上文中可以看到,单独使用@ExceptionHandler时,其必须在一个Controller中,然而当其与ControllerAdvice组合使用时就完全没有了这个限制。换句话说,二者的组合达到的全局的异常捕获处理。

常见的SpringMVC故障排查及解决方案是什么

(图5:注解ControllerAdvice异常处理代码)

在运行之前,需将之前Controller中的ExceptionHandler注释掉,测试结果如下:

常见的SpringMVC故障排查及解决方案是什么

(图6:注解ControllerAdvice异常处理结果) 

通过上面结果可以看到,异常处理确实已经变更为ExceptionHandlerAdvice类。这种方法将所有的异常处理整合到一处,去除了Controller中的继承关系,并且达到了全局捕获的效果,推荐使用此类方式;

2.3 实现HandlerExceptionResolver接口

HandlerExceptionResolver本身SpringMVC内部的接口,其内部只有resolveException一个方法,通过实现该接口我们可以达到全局异常处理的目的。

常见的SpringMVC故障排查及解决方案是什么

(图7:实现HandlerExceptionResolver接口)

同样在执行之前,将上述两个方法的异常处理都注释掉,运行结果如下:

常见的SpringMVC故障排查及解决方案是什么

(图8:实现HandlerExceptionResolver接口运行结果) 

可以看到500的异常处理已经生效了,但是400的异常处理却没有生效,并且根没有异常前的返回结果一样。这是怎么回事呢?不是说可以做到全局异常处理的么?没办法要想知道问题的原因,我们只能刨根问底,往Spring的祖坟上刨,下面我们结合Spring的源码调试,去需要原因。

三、Spring中异常处理源码分析

大家都知道,在Spring中第一个收到请求的类就是DispatcherServlet,而该类中核心的方法就是doDispatch,我们可以在该类中打断点,进而一步步跟进异常处理。

3.1 HandlerExceptionResolver实现类处理流程

参照如下的跟进步骤,在processhandlerException中断点,跟踪的结果如下图:

常见的SpringMVC故障排查及解决方案是什么

常见的SpringMVC故障排查及解决方案是什么

(图9:processHandlerException断点) 

可以看到在图中箭头【1】处,在遍历 handlerExceptionResolvers 进而来处理异常,而在箭头【2】处,看到handlerExceptionResolvers 中一共有4个元素,其中最后一个就是2.3方法定义的异常处理类

当前的请求query请求,根据上述现象可以推测出,该异常处理应该是在前3个异常处理中被处理了,从而跳过我们自定义的异常;带着这样的猜测,我们F8继续跟进,可以跟踪到该异常是被第三个,即DefaultHandlerExceptionResolver所处理。

  • DefaultHandlerExceptionResolver :SpringMVC默认装配了DefaultHandlerExceptionResolver,该类的doResolveException方法中主要对一些特殊的异常进行处理,并将这类异常转换为相应的响应状态码。而query请求触发的异常为MissingServletRequestParameterException,其恰好也是被DefaultHandlerExceptionResolver所针对的异常,故会在该类中被异常捕获。

到此真相大白了,可以看到我们的自定义类MyHandlerExceptionResolver确实可以做到全局处理异常,只不过对于query请求的异常,中间被DefaultHandlerExceptionResolver插了一脚,所以就跳过了MyHandlerExceptionResolver类的处理,从而出现400的返回结果。而对于calc请求,中间没有阻拦,所以就达到了预期效果。

3.2 三类异常的处理顺序

到此我们一共介绍了3类全局异常处理,按照上面的分析可以看出,实现HandlerExceptionResolver接口的方式是排在最后处理,那么@ExceptionHandler和@ControllerAdvice这两个的顺序谁先谁后呢? 将三类异常处理全部打开(之前注释掉了),运行一下看看效果:

常见的SpringMVC故障排查及解决方案是什么

(图10:异常处理全放开运行结果) 

通过现象可以看到,Controller中单独@ExceptionHandle异常处理排在了首位,@ControllerAdvice排在了第二位。严谨的童鞋可以写个Controller02,将query和calc复制过去,异常处理就不要了,这样请求c02的方法时,异常捕获的所属类名就都是@ControllerAdvice所在类了。

以上都是我们根据现象得到的结论,下面去Spring源码去找“证据”。在图9中,handlerExceptionResolvers中有4类处理器,而@ExceptionHandler和@ControllerAdvice的处理就在第一个ExceptionHandlerExceptionResolver中(之前断点跟进即可获知)。继续跟进直到进入ExceptionHandlerExceptionResolver类的doResolveHandlerMethodException方法,这里的HandlerMethod就是Spring将HTTP请求映射到指定Controller中的方法,而Exception就是需要被捕获的异常;继续跟进,看看使用这两个参数到底干了什么事儿。

常见的SpringMVC故障排查及解决方案是什么

(图11:doResolveHandlerMethodException断点) 

继续跟进getExceptionHandlerMethod方法,发现有两个变量可能就是问题的关键:exceptionHandlerCache和exceptionHandlerAdviceCache。首先,两者的变量名很值得怀疑;其次,前者在代码中看,明显是通过类作为key,从而得到一个处理器(resolver),这恰好Controller中@ExceptionHandler处理规则相吻合;最后,这两个Cache的处理顺序,也符合之前的得到的结论。正如之前猜测的那样,Spring中确实是优先根据Controller类名去查找对应的ExceptionHandler,没有找到的话,再进行@ControllerAdvice异常处理。

常见的SpringMVC故障排查及解决方案是什么

(图12:两个异常处理Cache )

如有兴趣可继续深入挖掘Spring的源码,这里针对 ExceptionHandlerExceptionResolver 简单做个总结:

  • exceptionHandlerCache中包含Controller中的ExceptionHandler异常处理,处理时通过HandlerMethod得到Controller,进而再找到异常处理方法,需要注意的是,其是在异常处理过程中put值的;

  • exceptionHandlerAdviceCache则是在项目启动时初始化的,大概思路是找到带有@ControllerAdvice注解的bean,从而缓存bean中的ExceptionHandler,在异常处理时需要对齐遍历查找处理,进而达到全局处理的目的。

3.3 解决方案

介绍了这么多,简单画张图总结一下。蓝色的部分是Spring默认添加的3类异常处理器,黄色部分是我们添加的异常处理以及其所被调用的位置和顺序。看看哪里还有不太清楚的,往回翻翻看(ResponseStatusExceptionResolver是针对@ResponseStatus注解,这里不再详述)。

常见的SpringMVC故障排查及解决方案是什么

(图13:异常总结)

如果有需要将MyHandlerExceptionResolver提前处理,甚至排在ExceptionHandlerExceptionResolver之前,能做到么?答案是肯定的,在Spring中如果想将MyHandlerExceptionResolver异常处理提前,需要再实现一个Ordered接口,实现里面的getOrder方法即可,这里返回-1,将其放在最上面,这次咸鱼终于可以翻身了。

常见的SpringMVC故障排查及解决方案是什么

(图14:实现Ordered接口)

运行看一下结果是不是符合预期,提醒一下,我们三个异常处理都是生效的,如下图: 

常见的SpringMVC故障排查及解决方案是什么

(图15:实现Ordered接口运行结果)

以上就是常见的SpringMVC故障排查及解决方案是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 常见的SpringMVC故障排查及解决方案是什么

本文链接: https://www.lsjlt.com/news/241313.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 常见的SpringMVC故障排查及解决方案是什么
    本篇文章给大家分享的是有关常见的SpringMVC故障排查及解决方案是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、前言相信我们每个人在SpringMVC开发中,都遇到...
    99+
    2023-06-05
  • 云服务器常见故障及解决方案
    云服务器常见故障包括: 资源故障:当服务器资源不足时,服务器可能无法正常使用。 解决方案:可以手动分配资源,确保所有资源可用,同时监控各个节点的资源使用情况,避免出现资源故障。 配置故障:当服务器配置不正确或者被篡改时,服务器可能出...
    99+
    2023-10-26
    常见故障 解决方案 服务器
  • 云服务器常见故障及解决方案分析
    云服务器是一种虚拟服务器,通常用于在云平台上提供高性能计算服务。下面是一些常见的云服务器常见故障和解决方案分析: 资源不足:当您正在使用云服务器时,您会发现它的硬件资源可能无法满足您的需求,例如您可能需要一个CPU或存储来运行大型文件或...
    99+
    2023-10-27
    常见故障 解决方案 服务器
  • 故障排除 PHP APCu 问题:常见陷阱和解决方案
    常见的 APCu 陷阱 APC.ttl 值太低: APC.ttl 决定缓存项的生存时间。值太低会导致缓存项过快失效,从而增加请求时间。 缓存太多数据: 缓存太多数据会占用大量内存,导致性能问题。选择性地缓存可以防止这种情况。 使用错误...
    99+
    2024-02-29
    PHP、APCu、缓存、性能、故障排除
  • 大数据中对讲机使用过程中的常见故障及排除故障的解决方法是什么
    今天就跟大家聊聊有关大数据中对讲机使用过程中的常见故障及排除故障的解决方法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  对讲机使用过程中的常见故障及排除故障的解决方法  问...
    99+
    2023-06-05
  • 云服务器常见故障及解决方案有哪些
    云服务器常见故障有以下几个方面: 性能问题:云服务器运行时需要处理大量的数据,因此它们很容易出现性能问题,比如CPU/内存不足、IO瓶颈、磁盘空间不足、磁盘故障等。 安全问题:云服务器是一种网络服务器,因此它需要处理大量用户数据和访问权...
    99+
    2023-10-27
    常见故障 解决方案 服务器
  • 云服务器常见故障及解决方案分析怎么写
    网络故障:当用户使用云服务器时,如果网络出现故障,会导致服务器无法访问。解决方案包括检查网络连接是否正常、使用DHCP自动分配IP地址、优化网卡流量等。 存储故障:云服务器一般都具有高可靠性和可扩展性,但当存储系统出现故障时,可能会影响到...
    99+
    2023-10-27
    常见故障 解决方案 服务器
  • 云服务器常见故障及解决方案分析报告
    宕机:当云服务器运行中出现问题时,如硬件故障、软件故障等,可能导致系统宕机。这种情况下,用户需要等待技术支持人员进行排查和修复,否则会导致业务中断。 数据库故障:当云服务器上的数据库出现故障时,可能会导致应用程序无法正常运行,从而影响用户...
    99+
    2023-10-27
    分析报告 常见故障 解决方案
  • MySQL故障排查的方法是什么
    MySQL故障排查方法主要包括以下几个步骤:1. 确认故障现象:通过观察数据库的表现和错误日志来判断故障的具体表现,比如错误代码、错...
    99+
    2023-10-20
    MySQL
  • 电脑常见的几种故障及解决方法
    电脑常见的几种故障及解决方法包括:1. 电脑无法启动:检查电源是否插好、电源线是否损坏、重启电脑、检查硬件连接是否正常。2. 蓝屏死...
    99+
    2023-09-07
    电脑
  • 云服务器常见故障及解决方案有哪些问题
    资源占用过高 云服务器通常采用高性能的硬件架构,但是如果资源占用过高,可能会导致服务器性能下降,甚至出现宕机的情况。为了解决这个问题,用户可以采取一些措施,例如增加服务器的存储容量、降低服务器的处理器速度、减少服务器的内存使用等。此外...
    99+
    2023-10-28
    常见故障 解决方案 服务器
  • 云服务器常见故障有哪些问题及解决方案
    无法连接:检查服务器的网络设置是否正确,确保服务器能够正常连接到互联网。可以尝试使用VPN连接,以加快连接速度。 资源超载:如果服务器资源不足,可能会导致连接中断或无法访问。可以尝试调整服务器的资源分配,或者限制用户的访问权限。 机房设备...
    99+
    2023-10-27
    常见故障 解决方案 服务器
  • 云服务器常见故障及解决方法
    云服务器是一种虚拟的存储和计算服务,通常用于在云端托管大量数据。常见的云服务器故障有以下几种: 硬件故障:云服务器的硬件故障可能导致服务器无法正常提供服务,例如服务器硬件损坏或系统崩溃。 数据丢失:如果您存储的数据被备份到其他云计算服务...
    99+
    2023-10-26
    解决方法 常见故障 服务器
  • Linux运维常见故障及处理的方法是什么
    今天就跟大家聊聊有关Linux运维常见故障及处理的方法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。作为Linux运维,多多少少会碰见这样那样的问题或故障,从中总结经验,查找问...
    99+
    2023-06-16
  • Python API 数组同步的常见问题及解决方案是什么?
    随着人工智能和数据分析的发展,Python 成为了最受欢迎的编程语言之一。Python 提供了各种数据结构来处理数据,其中数组是一种最常用的数据结构之一。但是在使用 Python 中的数组时,我们经常会遇到同步问题,这些问题可能会影响我们...
    99+
    2023-08-17
    api 数组 同步
  • ASP函数path同步的常见问题及解决方案是什么?
    在ASP开发中,我们经常会使用到path函数,它是用来获取当前脚本的物理路径的函数。但是,在使用path函数时,我们常常会遇到一些问题,比如路径同步不正确、路径分隔符错误等等。本文将为大家介绍path函数的常见问题及解决方案。 1.路径同...
    99+
    2023-09-30
    函数 path 同步
  • mysql死锁排查及解决的方法是什么
    MySQL死锁是指两个或多个事务相互等待对方持有的资源,导致无法继续执行的情况。为了排查和解决MySQL死锁,可以采取以下方法:1....
    99+
    2023-08-16
    mysql
  • 电脑显卡常见的故障及怎么解决
    这篇文章主要讲解了“电脑显卡常见的故障及怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“电脑显卡常见的故障及怎么解决”吧!常见故障一:开机无显示此类故障一般是因为显卡与主板接触不良或主...
    99+
    2023-06-28
  • Python常见报错及解决方法是什么
    这篇文章主要介绍“Python常见报错及解决方法是什么”,在日常操作中,相信很多人在Python常见报错及解决方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python常见报错及解决方法是什么”的疑...
    99+
    2023-07-06
  • 常见的 Python 错误及其解决方案
    此文整理了一些常见的 Python 错误及其解决方案。 1、SyntaxError: invalid syntax 说明:无效的语法是最常见的错误之一,通常是由于编写代码时违反了 Python 的语...
    99+
    2023-08-31
    python 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作