分享更有价值
被信任是一种快乐

Spring MVC异常解析器的原理是什么

文章页正文上

本篇内容主要讲解“Spring MVC异常解析器的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring MVC异常解析器的原理是什么”吧!使用介绍一般自定义异常处理策略有两种方式使用@ExceptionHandler注解实现HandlerExceptionResolver接口因为@ExceptionHandler注解的方式已经足够强大,所以我们一般也很少通过实现HandlerExceptionResolver来自定义异常处理策略。简单介绍一下@ExceptionHandler的使用,后面会结合这些例子进行源码分析访问如下链接免费云主机、域名,返回结果为把processRuntimeException方法注释掉以后,再次访问上面的链接,结果为如果在每个Controller里面都写异常解析器还是很麻烦的,能不能在一个地方统一处理异常呢?当然可以,这时候就不得不用到@RestControllerAdvice或者@ControllerAdvice写如下的全局异常解析器访问上面的链接,返回结果为我们把LocationController类的processException方法也注释掉,此时LocationController类里面已经没有被@ExceptionHandler注解标记的方法了访问上面的链接,返回结果为把MyExceptionHandler中的processRuntimeException方法注释掉访问上面的链接,返回结果为通过以上的例子,我们可以得出如下结论@RestControllerAdvice或者@ControllerAdvice类内的解析器的优先级低于@RequestMapping类的解析器的优先级如果一个异常能被多个解析器所处理,则选择继承关系最近的解析器假设BizException继承自NullPointException A方法解析BizException B方法解析NullPointException C方法解析ExceptionBizException会被A方法解析 NullPointException会被B方法解析 如果没有A方法,则BizException会被B方法解析,如果B方法也没有,则被C方法解析,不难理解哈@RestControllerAdvice和@ControllerAdvice有什么区别呢?名字上就可以猜出@RestControllerAdvice只是在@ControllerAdvice的基础上加了@ResponseBody注解,看一波源码也确实如此。所以@RestControllerAdvice类最终返回的是JSON,@ControllerAdvice最终返回的是视图。如果你不明白为什么加了@ResponseBody注解最终返回的内容为JSON,建议看一下返回值处理器相关的内容源码分析异常解析器接口定义如下Spring MVC默认的异常解析器存放在如下属性中顺序依次为ExceptionHandlerExceptionResolverResponseStatusExceptionResolverDefaultHandlerExceptionResolverUML图如下Order接口是用来排序的哈,Spring MVC默认的解析器不是通过Order接口来控制顺序的,因为默认的解析器都继承自AbstractHandlerExceptionResolver,并且都没有重写getOrder方法对Spring MVC比较清楚的小伙伴应该都知道DispatcherServlet属性的默认实现都定义在源码包的DispatcherServlet.properties文件中,List的顺序也是按这个来的。放一部分内容接下来分析这3个默认的HandlerExceptionResolverExceptionHandlerExceptionResolverExceptionHandlerExceptionResolver用于支持@ExceptionHandler,而@ExceptionHandler应该是我们最常的,方便我们自定义异常处理策略,比通过实现HandlerExceptionResolver接口的方式简单从AbstractHandlerMethodExceptionResolver#shouldApplyTo可以看到只有当handler为空或者handler的类型为HandlerMethod时(@RequestMapping返回的类型为HandlerMethod)才会执行后面的异常解析逻辑。所以你通过实现Controller接口或者实现HttpRequestHandler接口定义的Handler,这个注解是不起作用的@ExceptionHandler的处理过程主要和下面2个类有关系ExceptionHandlerExceptionResolver,ExceptionHandlerMethodResolver用几个成员变量说一下处理过程,就不贴过多的代码了ExceptionHandlerExceptionResolver可以看到ExceptionHandlerExceptionResolver类定义了自己的参数处理器,返回值处理器,消息转换器。所以你可以通过这些组件反向知道@ExceptionHandler方法支持的参数类型例如从如下方法可以知道,支持的参数类型为@SessionAttribute,@RequestAttribute等 如果你写个@RequestParam是肯定不会注入进来的最重要的4个map来了,ExceptionHandlerExceptionResolver的工作过程主要就是操作这4个mapexceptionHandlerCache保存了@RequestMapping对应的ExceptionHandlerMethodResolver,是在执行异常解析的过程中被赋值的exceptionHandlerAdviceCache保存了@ControllerAdvice对应的 ExceptionHandlerMethodResolver,是在ExceptionHandlerExceptionResolver被初始化的过程中赋值的而ExceptionHandlerMethodResolver你可以认为只是封装了一下Exception及其对应的Method以最开始的例子演示,ExceptionHandlerExceptionResolver初始化后此时exceptionHandlerCache是没有值的 访问如下链接后exceptionHandlerCache中的值如下,LocationController及其对应的ExceptionHandlerMethodResolver被放了进来追一下以下方法的执行 ExceptionHandlerExceptionResolver#doResolveHandlerMethodException ExceptionHandlerExceptionResolver#getExceptionHandlerMethod可以得出我们测试的结论@RestControllerAdvice或者@ControllerAdvice类内的解析器的优先级低于@RequestMapping类的解析器的优先级总体实现也不难,从exceptionHandlerCache中能找到解析器就返回执行,找不到就从exceptionHandlerAdviceCache中找,这不是就实现了优先级了吗?接着来看剩下的2个Map@ControllerAdvice的mappedMethods是在ExceptionHandlerExceptionResolver初始化的过程中赋值的@RequestMapping的mappedMethods是在执行异常解析的过程中被赋值的而exceptionLookupCache是在异常解析过程中,通过Exception查找Method的过程中基于mappedMethods做的缓存为什么在查找过程中要再做一次缓存呢?是因为根据异常类型获取处理方法的时候,一个异常可能有多个处理方法,即一个异常会从mappedMethods中查出多个处理方法,最后返回的是继承关系最近的异常对应的处理方法,所以在查找的时候又做了一次缓存,避免每次查mappedMethods然后取最优值。从exceptionLookupCache中就可以直接查到最优的处理方法以LocationController为例,查找一次异常后,exceptionLookupCache的值如下这样当再次发生ArithmeticException异常时就能从exceptionLookupCache找到对应的处理方法ResponseStatusExceptionResolverResponseStatusExceptionResolver和DefaultHandlerExceptionResolver的实现都不是很难,就不进行过多的分析了ResponseStatusExceptionResolver主要用来处理如下异常抛出的异常类型继承自ResponseStatusException抛出的异常类型被@ResponseStatus标记以一个例子来演示这个处理器的功能访问显示如下DefaultHandlerExceptionResolver用来处理一些常见的Http异常,如400:请求无效 405:请求方法不支持 500:内部服务器错误执行入口如果整个处理过程发生异常,依次调用DispatcherServlet的成员变量handlerExceptionResolvers的resolveException方法,找到第一个不为null的ModelAndView,然后返回到此,相信大家对“Spring MVC异常解析器的原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是云技术网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: css能不能让文字旋转

本文小编为大家详细介绍“css能不能让文字旋转”,内容详细,步骤清晰,细节处理妥当,希望这篇“css能不能让文字旋转”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 css能让文字旋转,其实现文字旋转的方法:1、新建一个html文件;…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册