给予这个控制器
@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
,结果也是一样的)
答案 0 :(得分:4)
Spring MVC为异常处理定义提供了许多不同的方法。
通常,它会尝试查找为处理异常而注册的最“特定”的异常处理程序。如果没有这样的处理程序,它将尝试检查异常的超类,也许它有一个处理程序,如果它也没有找到,它会更高级别等等等等,从最具体的一般。
如果你想在Spring的代码中看到它,学习这个主题的入口点将是:
org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver
此类解决了在应用程序上下文中注册的bean中通过@ExceptionHandler
方法注册的异常。反过来,这个类使用另一个类org.springframework.web.method.annotation.ExceptionHandlerMethodResolver
它负责映射标有@ExceptionHandler
注释的所有方法。