Oli*_*ssé 6 java spring spring-mvc 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";
}
Run Code Online (Sandbox Code Playgroud)
这两个ExceptionHandler都匹配,IllegalArgumentException因为它是Exceptionclass 的子级。
当我到达/test端点时,将handleIllegalException调用该方法。如果抛出NullPointerException,handleException则调用该方法。
spring如何知道应该执行handleIllegalException方法而不是handleException方法?当多个ExceptionHandler匹配一个Exception 时,它如何管理优先级?
(我认为顺序或ExceptionHandler声明很重要,但是即使我handleIllegalException之前声明了handleException,结果也是一样的)
Spring MVC为异常处理定义提供了许多不同的方法。
通常,它将尝试查找注册为处理异常的最“特定”异常处理程序。如果没有这样的处理程序,它将尝试检查异常的超类,也许有一个处理程序,如果还没有找到它,它将进一步向上移动,依此类推,从最具体到最一般。
如果您想在Spring的代码中看到它,则学习此主题的入口是:
org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver
Run Code Online (Sandbox Code Playgroud)
此类@ExceptionHandler从应用程序上下文中注册的Bean中解析通过方法注册的异常。此类依次使用另一个类org.springframework.web.method.annotation.ExceptionHandlerMethodResolver
,该类负责映射所有带有@ExceptionHandler注释的方法。
| 归档时间: |
|
| 查看次数: |
1238 次 |
| 最近记录: |