【问题标题】:How does spring manage ExceptionHandler priority?spring是如何管理ExceptionHandler优先级的?
【发布时间】:2018-02-10 20:07:42
【问题描述】:

给这个控制器

@GetMapping("/test")
@ResponseBody
public String test() {
  if (!false) {
    throw new IllegalArgumentException();
  }

  return "blank";
}

@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
@ResponseBody
public String handleException(Exception e) {
  return "Exception handler";
}

@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
@ResponseBody
public String handleIllegalException(IllegalArgumentException e) {
  return "IllegalArgumentException handler";
}

两个 ExceptionHandler 都与 IllegalArgumentException 匹配,因为它是 Exception 类的子类。

当我到达/test 端点时,方法handleIllegalException 被调用。如果我抛出NullPointerException,则调用handleException 方法。

spring 怎么知道它应该执行handleIllegalException 方法而不是handleException 方法?当多个 ExceptionHandler 匹配一个 Exception 时,它如何管理优先级?

(我认为顺序或ExceptionHandler声明很重要,但即使我在handleException之前声明handleIllegalException,结果也是一样的)

【问题讨论】:

  • 有注解@Order(Ordered.HIGHEST_PRECEDENCE)
  • 是的,但在我的示例中,我没有设置任何@Order,并且调用了handleIllegalException 方法,为什么不调用handleException 方法?当没有指定 Order 时,Spring 似乎会自行管理订单...
  • @surya 你的链接没有回答我的问题,它谈到了@Order 注释。当多个ExceptionHandler匹配一个异常时,它没有给出关于默认顺序的任何解释
  • 使用两类@controlleradvice 可以保证订单

标签: java spring spring-mvc exceptionhandler


【解决方案1】:

Spring MVC 为异常处理定义提供了许多不同的方法。

一般来说,它会尝试找到注册的最“特定”的异常处理程序来处理异常。如果没有这样的处理程序,它将尝试检查异常的超类,也许有它的处理程序,如果也没有找到,它会再上一层,依此类推,从最具体到最一般。

如果你想在 Spring 的代码中看到它,学习这个主题的切入点是:

org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver

这个类从应用上下文中注册的bean中解析通过@ExceptionHandler方法注册的异常。反过来,这个类使用另一个类org.springframework.web.method.annotation.ExceptionHandlerMethodResolver 它负责映射所有标有@ExceptionHandler注解的方法。

【讨论】:

  • 还有ExceptionDepthComparator
  • 嗯我打开了ExceptionHandlerExceptionResolver的源代码,我认为算法在方法getExceptionHandlerMethod中但是我没有看到负责找到最“具体”的代码在哪里" 异常处理程序注册
  • 我在ExceptionHandlerExceptionResolver中没有看到ExceptionDepthComparator的使用
  • 我不认为您也可以链接到文档的一部分?
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多