文章目录

0.前记

根据之前的文章​​DispatcherServlet.doDisptcher()​​​方法中的方法​​ha.handle​​​返回​​ModelAndView​​​处理的方法​​processDispatchResult​

private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
@Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv,
@Nullable Exception exception) throws Exception {

boolean errorView = false;

if (exception != null) {
if (exception instanceof ModelAndViewDefiningException) {
logger.debug("ModelAndViewDefiningException encountered", exception);
mv = ((ModelAndViewDefiningException) exception).getModelAndView();
}
else {
Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
mv = processHandlerException(request, response, handler, exception);
errorView = (mv != null);
}
}

SpringMvc 源码分析 (异常处理流程) (十三)_解析器

1.processHandlerException方法

这个方法就是如果出现异常的话, 异常解析器进行处理异常。

SpringMvc 源码分析 (异常处理流程) (十三)_spring_02

SpringMvc 源码分析 (异常处理流程) (十三)_前端_03

  1. 先判断是否是​​@ExceptionHandler​​​注解下的方法, 如果是的话另外处理​​AbstractHandlerMethodExceptionResolver.doResolveException()​​​ ->​​ExceptionHandlerExceptionResolver.doResolveHandlerMethodException()​
  2. 判断是否是​​@ResponseStatus​​​注解下的方法​​RespinseStatusExceptionResolver.doResolveException​
  3. ​DefaultHandlerExceptionResolver.doResolveException()​

这里的​​HandlerExceptionResolver​​主要有3个实现类

SpringMvc 源码分析 (异常处理流程) (十三)_前端_04

1.1​​@ExceptionHandler​​注解下的异常

​AbstractHandlerMethodExceptionResolver.doResolveException()​

SpringMvc 源码分析 (异常处理流程) (十三)_spring_05

SpringMvc 源码分析 (异常处理流程) (十三)_3d_06

1.2​​@ResponseStatus​​注解下的方法

SpringMvc 源码分析 (异常处理流程) (十三)_前端_07

SpringMvc 源码分析 (异常处理流程) (十三)_3d_08

protected ModelAndView resolveResponseStatus(ResponseStatus responseStatus, HttpServletRequest request,
HttpServletResponse response, @Nullable Object handler, Exception ex) throws Exception {

int statusCode = responseStatus.code().value();
String reason = responseStatus.reason();
return applyStatusAndReason(statusCode, reason, response);
}

SpringMvc 源码分析 (异常处理流程) (十三)_java_09

  1. 获取到装填码
  2. 获取到出错理由
  3. 然后渲染异常的页面
  4. 返回空的ModelAndView

SpringMvc 源码分析 (异常处理流程) (十三)_3d_10

1.3​​DefaultHandlerExceptionResolver​​解析方法

SpringMvc 源码分析 (异常处理流程) (十三)_3d_11


这里比如​​handleMissingServletRequestParameter​​​ 这个 ​​return​

SpringMvc 源码分析 (异常处理流程) (十三)_解析器_12

SpringMvc 源码分析 (异常处理流程) (十三)_前端_13


会跳转页面 + 返回空的ModelAndView