Spring如何管理ExceptionHandler优先级?

问题描述 投票:3回答:1

给这个控制器

@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匹配异常时,它如何管理优先级?

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

java spring spring-mvc exceptionhandler
1个回答
4
投票

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

通常,它将尝试查找为处理异常而注册的最“特定”的异常处理程序。如果没有这样的处理程序,它将尝试检查异常的超类,也许它有一个处理程序,如果它也没有找到,它会更高级别等等等等,从最具体的一般。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.