精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解SpringBoot接口異常處理機制及源碼分析

開發 前端
如果異常仍然未解決,則為null,以便后續的解析器嘗試,如果異常在最后仍然存在,則允許它向上冒泡到Servlet容器。

環境:Springboot3.0.5

概述

如果在請求映射期間發生異常或從請求處理程序(例如@Controller)拋出異常,DispatcherServlet將委托給HandlerExceptionResolver。

下表列出了可用的HandlerExceptionResolver實現。

HandlerExceptionResolver 實現類:

HandlerExceptionResolver

描述

SimpleMappingExceptionResolver

異常類名和錯誤視圖名之間的映射。用于在瀏覽器應用程序中渲染錯誤頁面。

DefaultHandlerExceptionResolver

解析Spring MVC引發的異常,并將其映射為HTTP狀態碼。

ResponseStatusExceptionResolver

使用@ResponseStatus注解解析異常,并根據注解中的值將異常映射為HTTP狀態碼。

ExceptionHandlerExceptionResolver

通過在@Controller或@ControllerAdvice類中調用由@ExceptionHandler注釋的方法來解決異常。

我們可以聲明多個HandlerExceptionResolver

HandlerExceptionResolver的約定規定它可以返回:

  • 指向錯誤視圖的ModelAndView。
  • 如果異常是在解析器中處理的,則返回空的ModelAndView。
  • 如果異常仍然未解決,則為null,以便后續的解析器嘗試,如果異常在最后仍然存在,則允許它向上冒泡到Servlet容器。

Controller接口調用原理

SpringMVC請求入口通過DispatcherServlet執行大致核心流程如下:

  1. 首先通過HandlerMapping確定目標Handler對象(如果接口是Controller那么這里會是 HandlerMethod)
  2. 通過上一步Handler對象,確定執行真正調用的HandlerAdapter

這里以Controller接口為例,HandlerAdapter對象為RequestMappingHandlerAdapter。

DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
  protected void doDispatch(...) throws Exception {
    HandlerExecutionChain mappedHandler = null;
    try {
      Exception dispatchException = null;
      // 根據請求確定Handler對象(遍歷所有的HandlerMapping)
      mappedHandler = getHandler(processedRequest);
      // 根據上一步確定的Handler對象,確定HandlerAdapter對象
      HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
      // 真正執行目標方法的調用
      mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    } catch (Exception ex) {
      dispatchException = ex;
    } catch (Throwable err) {
      dispatchException = new ServletException("Handler dispatch failed: " + err, err);
    }
    processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
  }
}

RequestMappingHandlerAdapter

public class RequestMappingHandlerAdapter {
  protected ModelAndView handleInternal(...) throws Exception {
    ModelAndView mav;
    mav = invokeHandlerMethod(request, response, handlerMethod);
  }
  protected ModelAndView invokeHandlerMethod(...) throws Exception {
    // ...
    ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
    // ... 對ServletInvocableHandlerMethod進行配置
    invocableMethod.invokeAndHandle(webRequest, mavContainer);
    return getModelAndView(mavContainer, modelFactory, webRequest);
  }
}

ServletInvocableHandlerMethod執行參數解析目標Controller方法調用及返回值的處理。

public class ServletInvocableHandlerMethod extends InvocableHandlerMethod {
  public void invokeAndHandle(...) throws Exception {
    // 該方法中會進行請求參數的解析及目標方法的調用
    Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
    // ...
    try {
      // 處理返回值
      this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
    } catch (Exception ex) {
      throw ex;
    }
  }
}

通過上面的源碼分析,在調用過程中如果發生了異常會將異常直接拋出,在DispatcherServlet中會進行異常的處理。

異常解析原理分析

接著上面的源碼分析,當發生異常后最終會在DispatcherServlet#processDispatchResult方法中進行處理。

public class DispatcherServlet extends FrameworkServlet {
  /*
    * 默認情況下有如下2個異常解析器
    * 1. DefaultErrorAttributes
    * 2. ExceptionHandlerExceptionResolver
    */
  private List<HandlerExceptionResolver> handlerExceptionResolvers;
  private void processDispatchResult(...) {
    if (exception != null) {
      Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
      // 處理異常
      mv = processHandlerException(request, response, handler, exception);
    }
  }
  protected ModelAndView processHandlerException(...) throws Exception {
    ModelAndView exMv = null;
    if (this.handlerExceptionResolvers != null) {
      // 遍歷所有的異常解析器
      for (HandlerExceptionResolver resolver : this.handlerExceptionResolvers) {
        // 解析異常,核心的解析器是ExceptionHandlerExceptionResolver
        exMv = resolver.resolveException(request, response, handler, ex);
      }
    }
    // ...
  }
}

ExceptionHandlerExceptionResolver類繼承自AbstractHandlerMethodExceptionResolver該類又繼承自AbstractHandlerExceptionResolver。

// 調用父類(AbstractHandlerExceptionResolver)方法
public abstract class AbstractHandlerExceptionResolver implements HandlerExceptionResolver, Ordered {
  public ModelAndView resolveException(...) {
    // doResolveException該方法在子類AbstractHandlerMethodExceptionResolver中重寫
    ModelAndView result = doResolveException(request, response, handler, ex);
  }
}

AbstractHandlerMethodExceptionResolver

public abstract class AbstractHandlerMethodExceptionResolver extends AbstractHandlerExceptionResolver {
  protected final ModelAndView doResolveException(...) {
    HandlerMethod handlerMethod = (handler instanceof HandlerMethod hm ? hm : null);
    return doResolveHandlerMethodException(request, response, handlerMethod, ex);
  }
}

ExceptionHandlerExceptionResolver

public class ExceptionHandlerExceptionResolver extends AbstractHandlerMethodExceptionResolver implements ApplicationContextAware, InitializingBean {
  protected ModelAndView doResolveHandlerMethodException(...) {
    // 該方法中會先從當前的Controller中查找是否有@ExceptionHandler注解的方法(如果匹配)
    // 如果沒有再從全局的異常處理類句柄中查找
    ServletInvocableHandlerMethod exceptionHandlerMethod = getExceptionHandlerMethod(handlerMethod, exception);
    if (exceptionHandlerMethod == null) {
      return null;
    }
    // 執行異常處理方法的調用
    exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, arguments);
  }
  protected ServletInvocableHandlerMethod getExceptionHandlerMethod(...) {
    Class<?> handlerType = null;
    if (handlerMethod != null) {  
      handlerType = handlerMethod.getBeanType();
      // 緩存并設置當前執行Class對應的ExceptionHandlerMethodResolver
      // ExceptionHandlerMethodResolver構造函數中會解析當前類中的所有方法是否有@ExceptionHandler注解
      ExceptionHandlerMethodResolver resolver = this.exceptionHandlerCache.computeIfAbsent(handlerType, ExceptionHandlerMethodResolver::new);
      // 解析是否匹配當前發生的異常
      Method method = resolver.resolveMethod(exception);
      if (method != null) {
        return new ServletInvocableHandlerMethod(handlerMethod.getBean(), method, this.applicationContext);
      }
    }
    // 如果上面的執行的Class中沒有找到對應處理器,那么就從全局的異常處理中進行查找匹配
    // 這里的exceptionHandlerAdviceCache集合在類初始化執行時已經處理完成
    for (Map.Entry<ControllerAdviceBean, ExceptionHandlerMethodResolver> entry : this.exceptionHandlerAdviceCache.entrySet()) {
      ControllerAdviceBean advice = entry.getKey();
      if (advice.isApplicableToBeanType(handlerType)) {
        ExceptionHandlerMethodResolver resolver = entry.getValue();
        Method method = resolver.resolveMethod(exception);
        if (method != null) {
          return new ServletInvocableHandlerMethod(advice.resolveBean(), method, this.applicationContext);
        }
      }
    }
    return null;
  }
}

通過上面的源碼分析你應該知道了關于SpringMVC中異常處理的原理。

當上面的異常處理機制都沒法處理,那么將會調用默認的/error接口。

public class ErrorMvcAutoConfiguration {
  @Bean
  @ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
  public BasicErrorController basicErrorController(ErrorAttributes errorAttributes, ObjectProvider<ErrorViewResolver> errorViewResolvers) {
    return new BasicErrorController(errorAttributes, this.serverProperties.getError(), errorViewResolvers.orderedStream().toList());
  }  
}

BasicErrorController

@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
}

上面的錯誤接口/error在容器啟動時會自動注冊到內嵌的容器中,如:Tomcat。

責任編輯:武曉燕 來源: 實戰案例錦集
相關推薦

2011-03-17 09:20:05

異常處理機制

2010-03-05 15:40:16

Python異常

2023-03-08 08:54:59

SpringMVCJava

2011-07-21 15:20:41

java異常處理機制

2021-03-02 09:12:25

Java異常機制

2023-02-23 08:15:33

Spring異常處理機制

2021-07-03 17:53:52

Java異常處理機制

2011-04-06 10:27:46

Java異常處理

2009-08-05 18:09:17

C#異常處理機制

2024-03-04 10:00:35

數據庫處理機制

2009-09-02 18:34:28

C#鼠標事件

2021-03-25 07:44:39

C++異常處理開發技術

2015-12-28 11:25:51

C++異常處理機制

2011-07-01 14:20:59

Qt 事件

2011-07-01 14:14:34

Qt 事件

2025-06-09 01:15:00

2014-05-22 14:57:28

Android消息處理機制Looper

2014-05-22 15:18:25

Android消息處理機制Looper

2014-05-22 15:15:53

Android消息處理機制Looper

2014-05-22 15:33:31

Android消息處理機制Looper
點贊
收藏

51CTO技術棧公眾號

亚洲黄色在线| 伊人久久影院| 国产精品乱码久久久久久| 91精品国产综合久久男男| a级黄色免费视频| 精品国产亚洲日本| 岛国视频午夜一区免费在线观看| 日本免费高清一区| 国产视频www| 99精品视频免费观看| 国产一区二区三区直播精品电影| xxww在线观看| 国产色婷婷在线| 久久久久综合网| 亚洲xxxxx电影| 精品不卡一区二区| 亚洲精品一区二区妖精| 亚洲二区在线播放视频| 中文字幕66页| 亚洲欧美一区二区三区| 亚洲免费在线视频一区 二区| 97中文在线观看| 无码人妻丰满熟妇区bbbbxxxx| 天天射天天综合网| 亚洲欧美国产视频| 免费啪视频在线观看| 日韩成人亚洲| 都市激情亚洲色图| 男人的天堂avav| 亚洲欧美视频一区二区| 99国产精品久久久| 99久久精品无码一区二区毛片| 波多野结衣在线观看视频| 国产一区欧美| 久久精品免费电影| 国产真人真事毛片视频| 日韩丝袜视频| 亚洲第一福利网站| 绯色av蜜臀vs少妇| www欧美在线观看| 欧美性三三影院| 成人免费观看毛片| av男人的天堂在线观看| 伊人性伊人情综合网| 色视频一区二区三区| 日本一卡二卡四卡精品| k8久久久一区二区三区| 99九九视频| 成人小说亚洲一区二区三区 | 久久亚洲一级片| 国产精品香蕉视屏| 国产小视频一区| 国产凹凸在线观看一区二区 | 女仆av观看一区| 精品国产123| 久久久久亚洲av无码专区首jn| 99tv成人影院| 日韩精品影音先锋| av不卡中文字幕| 国产精品白浆| 亚洲精品720p| 波多野结衣一二三区| 国产+成+人+亚洲欧洲在线| 亚洲成人网久久久| 美国黄色一级毛片| 亚洲国产欧美日韩在线观看第一区 | √…a在线天堂一区| 亚洲午夜精品久久久久久浪潮| 成人在线免费公开观看视频| 国产农村妇女精品| 中文精品一区二区三区| 操你啦视频在线| 亚洲综合丁香婷婷六月香| a级黄色小视频| 中文字幕高清在线播放| 欧美色综合网站| 99精品视频国产| 99久久香蕉| 精品一区二区三区四区| 天堂在线中文视频| 在线精品视频在线观看高清| 欧美激情在线视频二区| 91在线视频在线观看| 三级影片在线观看欧美日韩一区二区| 国产激情视频一区| 91久久久久国产一区二区| 国产1区2区3区精品美女| 国产一区二区在线观看免费播放| 视频一区二区在线播放| 欧美国产禁国产网站cc| xxxxxx在线观看| 三级在线看中文字幕完整版| 欧美三级电影精品| 亚洲女则毛耸耸bbw| 你微笑时很美电视剧整集高清不卡| 国产亚洲精品美女久久久久| 成人性生活毛片| 99精品免费网| 亚洲aa中文字幕| 日韩av资源| 中文字幕综合网| 97成人在线观看视频| 欧美大片网站| 日韩久久精品电影| 日本黄色免费片| 国产精品亚洲综合久久| 成人综合网网址| 四虎永久在线精品免费网址| 国产精品无人区| 精品久久久久久久久久中文字幕| 国产亚洲精彩久久| 日韩精品免费电影| 欧美久久久久久久久久久久| 久久中文在线| 国产精品久久久久久久免费大片| 在线国产情侣| 欧美丝袜美女中出在线| 久久久久亚洲av无码麻豆| 久久不见久久见免费视频7| 欧美精品一区二区三区国产精品 | 久久久999| 国产精品三区www17con| 老司机在线看片网av| 色哟哟欧美精品| 日韩Av无码精品| 中文在线日韩| 国产区精品视频| 黄色在线网站| 精品久久久久久久中文字幕| 国产免费无码一区二区| 天天射成人网| 国产精品网红直播| 国产三级在线免费| 欧美性生交xxxxx久久久| 9.1在线观看免费| 91成人看片| 国产精品自产拍在线观看中文| 欧美色综合一区二区三区| 亚洲午夜一二三区视频| 一起草最新网址| 综合在线视频| 亚洲一区二区自拍| 国产在线看片| 欧美一区二区三区公司| 婷婷社区五月天| 国内不卡的二区三区中文字幕 | 一级黄色片大全| 国产日韩视频| 免费久久久一本精品久久区| 久草在线中文最新视频| 亚洲精品suv精品一区二区| 日本少妇xxxx动漫| av福利精品导航| 免费看日本毛片| 秋霞蜜臀av久久电影网免费| 97超碰国产精品女人人人爽 | 欧美福利小视频| 午夜精品久久久久久久爽 | 久久久久国产免费免费 | 国产一区中文字幕| 裸体大乳女做爰69| 中文在线综合| 97视频在线观看视频免费视频 | 91在线视频播放| 国产91对白刺激露脸在线观看| 亚洲影院天堂中文av色| 国产成人精品av| 久cao在线| 欧美r级电影在线观看| 黄色片视频网站| 久久丝袜美腿综合| 色戒在线免费观看| 亚洲欧美综合国产精品一区| 国产精品一区二区免费| 欧美人体一区二区三区| 中文字幕一区日韩电影| 国产白浆在线观看| 婷婷国产v国产偷v亚洲高清| 免费看黄色的视频| 久久精品国产久精国产爱| 亚洲高潮无码久久| 欧美男男freegayvideosroom| 日本久久亚洲电影| av软件在线观看| 亚洲国产精品va在看黑人| 老熟妇一区二区三区| 亚洲欧美怡红院| 欧美激情 亚洲| 日韩电影一区二区三区| 黄色片免费在线观看视频| 亚洲97av| 亚洲最大福利网站| 成人爱爱网址| 九九热这里只有在线精品视| 欧美欧美欧美| 日韩欧美一区中文| 波多野结衣不卡| 一区二区三区国产| 亚洲国产天堂av| 国产激情一区二区三区四区| 国产成人a亚洲精v品无码| 中文字幕免费精品| 天天久久人人| 日韩在线麻豆| 91国产在线免费观看| 成人性生交大片免费观看网站| www.亚洲一区| 国产一二在线观看| 亚洲国产精品久久91精品| 亚洲视频在线观看免费视频| 黄色一区二区在线| 日韩三级久久久| 国产嫩草影院久久久久| 国产精品嫩草av| 国产伦理精品不卡| 色乱码一区二区三区在线| 国产精品久久久一区二区| 国产树林野战在线播放| 欧美手机视频| 久久精品综合一区| 我要色综合中文字幕| 国产欧美精品一区二区三区介绍 | 国产精品美女免费视频| 黄色软件视频在线观看| 久久国产精品电影| 日本中文字幕电影在线免费观看| 精品亚洲国产视频| 西西人体44www大胆无码| 欧美一级爆毛片| 国产一区二区三区中文字幕| 91传媒视频在线播放| 天天干天天干天天干天天| 亚洲高清免费视频| 看片网站在线观看| 亚洲人成亚洲人成在线观看图片| 国产传媒国产传媒| 久久久久久久久久久久久夜| 国产精品300页| 99视频有精品| 中文文字幕文字幕高清| 丁香桃色午夜亚洲一区二区三区| 永久av免费在线观看| 久久精品国产精品亚洲精品| 久久久国产欧美| 日韩av一区二区三区四区| 日韩精品一区二区三区不卡 | 久久久久久蜜桃一区二区| 日本中文字幕一区二区有限公司| 国产日产欧美视频| 久久久久久黄| 亚洲乱码国产一区三区| 久久久久久婷| 日韩免费高清在线| 蜜桃一区二区三区在线| 第四色婷婷基地| 精彩视频一区二区三区| 亚洲国产日韩在线一区| 国产成人一级电影| 亚洲色图欧美另类| 99精品1区2区| 欧美偷拍一区二区三区| 国产视频一区在线播放| 日韩一级片在线免费观看| 国产精品国产自产拍在线| 精品无码一区二区三区蜜臀| 亚洲激情网站免费观看| 黑人狂躁日本娇小| 亚洲免费在线播放| 国语对白一区二区| 亚洲v日本v欧美v久久精品| 91美女免费看| 欧美综合一区二区| 国产一区二区网站| 欧美电影免费提供在线观看| 五月天婷婷在线播放| 国产亚洲a∨片在线观看| 亚洲乱亚洲乱妇| 欧美激情第99页| 三上悠亚一区二区| 91中文字幕在线| 欧美亚洲国产日韩| 亚洲日本理论电影| 亚洲国产国产亚洲一二三| av片中文字幕| 国产一区二区久久| www.色多多| 亚洲欧洲精品一区二区三区| 五月天婷婷网站| 精品视频999| 免费看日韩av| 一区二区三区动漫| 在线看女人毛片| 热久久视久久精品18亚洲精品| 亚洲一区二区av| 精品国产一区二区三区免费| 日韩系列欧美系列| 无码人妻精品一区二区蜜桃百度| 男人天堂欧美日韩| av在线网站免费观看| 国产日本亚洲高清| 国产精品成人国产乱| 欧美三级在线看| 天天在线女人的天堂视频| 久久夜色撩人精品| 天天综合网天天| 国产日韩欧美亚洲一区| 97视频热人人精品免费| 女人天堂av手机在线| 国产一区91精品张津瑜| 亚洲国产av一区| 午夜精品久久久| 国产裸体永久免费无遮挡| 亚洲欧美制服丝袜| 国产一线二线在线观看| 成人免费激情视频| 欧美精品一区二区久久| 国产精品自拍片| 国产成人免费视频精品含羞草妖精| 懂色av蜜桃av| 日韩欧美福利视频| 欧美性受xxxx狂喷水| 久久av红桃一区二区小说| 久久精品资源| 日韩视频在线播放| 久久深夜福利| 天堂久久久久久| 偷拍与自拍一区| 黄色一级大片在线免费看国产| 日韩中文字幕在线看| 3d性欧美动漫精品xxxx软件| 国产亚洲精品久久飘花| 欧美日韩91| 免费观看黄网站| 亚洲人妖av一区二区| 精品乱码一区内射人妻无码| 亚洲欧美在线看| 色黄视频在线观看| 久久久久se| 亚洲专区免费| 丰满圆润老女人hd| 色综合天天做天天爱| 日韩一区二区三区中文字幕| 午夜精品久久久久久99热| 日韩精品免费视频一区二区三区| 中文字幕一区二区三区四区五区| 日韩成人精品在线| 99国产精品无码| 欧美日韩国产成人在线免费| 在线看免费av| 91亚洲人电影| 国产精品观看| 欧亚乱熟女一区二区在线| 亚洲高清一区二区三区| 手机看片一区二区| 清纯唯美亚洲激情| 狠狠色狠狠色综合婷婷tag| 天堂在线资源视频| 中文字幕中文字幕一区| 国产精品玖玖玖| 欧美日韩国产91| 欧美自拍视频| 99草草国产熟女视频在线| 欧美国产精品久久| 国产男男gay体育生网站| 欧美福利视频在线| 亚洲人挤奶视频| 三级在线视频观看| 亚洲特级片在线| 六月婷婷综合网| 日本久久91av| 亚洲国产精品综合久久久 | 老牛国内精品亚洲成av人片| 青青视频在线播放| 国产精品蜜臀在线观看| www.日韩高清| 日本精品久久久久影院| 97精品国产| 欧亚乱熟女一区二区在线 | 性一交一乱一色一视频麻豆| 国产69精品久久久久9999| 免费黄色成人| 国产欧美激情视频| 亚洲成人综合视频| 国产精品一二三区视频| 91中文字幕在线| 亚洲欧美日本国产专区一区| 免费一级suv好看的国产网站| 精品久久久久久最新网址| 欧美黑人疯狂性受xxxxx野外| 综合久久国产| 91色porny蝌蚪| aa视频在线免费观看| 18久久久久久| 亚洲精品二区三区| 亚洲成人黄色av| 欧美mv日韩mv国产| 色综合.com| 日本久久久精品视频| 亚洲精品国产精品乱码不99| 免费a在线观看|