java-Spring如何管理ExceptionHandler优先级?

给这个控制器

@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,结果也是一样的)

解决方法:

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

通常,它将尝试查找注册为处理异常的最“特定”异常处理程序.如果没有这样的处理程序,它将尝试检查异常的超类,也许有一个处理程序,如果还没有找到它,它将进一步向上移动,依此类推,从最具体到最一般.

如果您想在Spring的代码中看到它,则学习此主题的入口是:

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

此类从应用程序上下文中注册的Bean中解析通过@ExceptionHandler方法注册的异常.此类又使用了另一个类org.springframework.web.method.annotation.ExceptionHandlerMethodResolver
它负责映射标记有@ExceptionHandler批注的所有方法.

上一篇:Spring ExceptionHandler如何处理运行时异常


下一篇:@ControllerAdvice和@ExceptionHandler