为了账号安全,请及时绑定邮箱和手机立即绑定

设置多个@ControllerAdvice @ExceptionHandlers的优先级

设置多个@ControllerAdvice @ExceptionHandlers的优先级

慕后森 2019-10-28 10:58:09
我有多个用注释的类@ControllerAdvice,每个类都有一个@ExceptionHandler方法。一个处理程序Exception的意图是,如果找不到更多特定的处理程序,则应使用该处理程序。遗憾的是,Spring MVC似乎总是使用最通用的情况(Exception),而不是使用更具体的情况(IOException例如)。这是人们期望Spring MVC表现的方式吗?我试图从Jersey模拟一个模式,该模式评估每个ExceptionMapper(等效组件)以确定它处理的声明类型与引发的异常之间的距离,并且始终使用最接近的祖先。
查看完整描述

3 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

这是人们期望Spring MVC表现的方式吗?


从Spring 4.3.7开始,Spring MVC的行为如下:它使用HandlerExceptionResolver实例来处理由处理程序方法引发的异常。


默认情况下,Web MVC配置注册一个HandlerExceptionResolverbean HandlerExceptionResolverComposite,即


委托其他名单HandlerExceptionResolvers。


那些其他解析器是


ExceptionHandlerExceptionResolver

ResponseStatusExceptionResolver

DefaultHandlerExceptionResolver

以该顺序注册。出于这个问题的目的,我们只关心ExceptionHandlerExceptionResolver。


一AbstractHandlerMethodExceptionResolver,通过解析异常@ExceptionHandler的方法。


在上下文初始化时,Spring将为它检测到的ControllerAdviceBean每个带@ControllerAdvice注释的类生成一个。该ExceptionHandlerExceptionResolver会从上下文检索这些,并使用排序,使用AnnotationAwareOrderComparator其


是对扩展的OrderComparator支持,它支持Spring的Ordered 接口以及@Order和@Priority批注,并由Ordered实例提供的订单值覆盖静态定义的批注值(如果有)。


然后,ExceptionHandlerMethodResolver将为每个这些ControllerAdviceBean实例注册一个(将可用@ExceptionHandler方法映射到它们打算处理的异常类型)。最后,将它们以相同的顺序添加到中LinkedHashMap(保留迭代顺序)。


当发生异常时,ExceptionHandlerExceptionResolver会遍历这些异常ExceptionHandlerMethodResolver并使用可以处理异常的第一个异常。


因此,这里的一点是:如果你有一个@ControllerAdvice带有@ExceptionHandler用于Exception该被另一注册前@ControllerAdvice与类@ExceptionHandler的更具体的例外,比如IOException,是第一个将被调用。如前所述,您可以通过@ControllerAdvice实现Ordered带注释的类或用@Order或对其进行注释@Priority并为其指定适当的值来控制该注册顺序。


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 7257 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信