最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring MVC異常處理機(jī)制示例詳解

 更新時(shí)間:2019年11月07日 08:31:20   作者:張濤tom  
這篇文章主要給大家介紹了關(guān)于Spring MVC異常處理機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring MVC具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在Spring MVC中,當(dāng)一個(gè)請(qǐng)求發(fā)生異常(Controller拋出一個(gè)異常時(shí)), DispatcherServlet 采用委托的方式交給一個(gè)處理鏈來(lái)處理或者解析這個(gè)拋出的異常,這是在request和Servlet Container之間的一道屏障,所以我們可以在這里做一些處理工作,如轉(zhuǎn)換異常,轉(zhuǎn)換成友好的error page或者h(yuǎn)ttp 狀態(tài)碼等。

核心接口

這個(gè)處理機(jī)制在Spring是以HandlerExceptionResolver接口為核心的,該接口只有一個(gè)處理方法:

ModelAndView resolveException(
 HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);

對(duì)于返回值 ModelAndView,有如下約定:

  • ModelAndView 指向一個(gè)頁(yè)面
  • 空的ModelAndView,表示異常已經(jīng)在 HandlerExceptionResolver內(nèi)部處理完成
  • null表示異常未處理,需要繼續(xù)執(zhí)行其它的HandlerExceptionResolver

你可以通過(guò)聲明多個(gè)HandlerExceptionResolver bean,并實(shí)現(xiàn)Ordered接口,來(lái)組成一個(gè)有順序的HandlerExceptionResolver chain來(lái)處理異常。

Spring已經(jīng)提供了以下幾種實(shí)現(xiàn):

  • SimpleMappingExceptionResolver 處理邏輯是根據(jù)Exception的class name映射成指定的error page。
  • DefaultHandlerExceptionResolver 是根據(jù)異常的類型轉(zhuǎn)成http 狀態(tài)碼。
  • ResponseStatusExceptionResolver 是根據(jù)把異常和狀態(tài)碼通過(guò)@ResponseStatus綁定,當(dāng)有異常拋出時(shí),最終給客戶端返回對(duì)應(yīng)的狀態(tài)碼。
  • ExceptionHandlerExceptionResolver 是處理@ExceptionHandler的解析類,當(dāng)有異常發(fā)生時(shí),交給@ExceptionHandler方法去處理。

處理邏輯

對(duì)ExceptionResolver的處理是在DispatcherServlet中進(jìn)行的

DispatcherServlet有一個(gè)屬性,這就表示前邊提到的chain:

/** List of HandlerExceptionResolvers used by this servlet */
private List<HandlerExceptionResolver> handlerExceptionResolvers;

在DispatcherServlet初始化的時(shí)候同時(shí)對(duì)handlerExceptionResolvers進(jìn)行了初始化

它從ApplicationContext中查詢所有HandlerExceptionResolver bean,然后排序,上邊這就是初始化工作.

在processHandlerException方法完成的對(duì) HandlerExceptionResolver chain的調(diào)用,返回值不為null,即視作處理完成

// Check registered HandlerExceptionResolvers...
  ModelAndView exMv = null;
for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers) {
   exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);
  if (exMv != null) {
    break;
    }
  }

自定義異常處理器,可以實(shí)現(xiàn)HandlerExceptionResolver,也可以繼承AbstractHandlerExceptionResolver類,實(shí)現(xiàn)doResolveException方法即可。

這里重點(diǎn)說(shuō)下功能最為豐富的ExceptionHandlerExceptionResolver

通過(guò)@ExceptionHandler注解的方法,被視為異常處理方法,是通過(guò)ExceptionHandlerExceptionResolver來(lái)處理。該方法支持的參數(shù)類型有:

  • Exception
  • Request/Response
  • Session
  • WebRequest or NativeRequest
  • java.util.Locale
  • java.io.InputStream / java.io.Reader
  • java.io.OutputStream / java.io.Writer
  • org.springframework.ui.Model

支持的返回值類型有:

  • ModelAndView object (Servlet MVC or Portlet MVC).
  • org.springframework.ui.Model
  • java.util.Map object for exposing a model
  • org.springframework.web.servlet.View.
  • String value which is interpreted as view name.
  • @ResponseBody  可以通過(guò)message converters 搭配內(nèi)容協(xié)商來(lái)轉(zhuǎn)換消息體.
  • HttpEntity<?> or ResponseEntity<?>
  • void 如果直接通過(guò)Response回寫消息流,則該方法可以返回void

@ExceptionHandler搭配 @ControllerAdvice使用,可作為全局異常處理器

@ControllerAdvice
public class GlobalExceptionController {
 @ExceptionHandler(CustomGenericException.class)
 public ModelAndView handleCustomException(CustomGenericException ex) {
ModelAndView model = new ModelAndView("error/error");
  model.addObject("code”, ex.getErrCode());
  model.addObject(“msg”, ex.getErrMsg());
  return model;
 }
 @ExceptionHandler(Exception.class)
 public ModelAndView handleAllException(Exception ex) {
  ModelAndView model = new ModelAndView("error/error");
  model.addObject(“msg”, "this is Exception.class");
  return model;
 }
}

以上便是Spring MVC中的異常處理邏輯,如有不對(duì)的地方,歡迎拍磚。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 使用JDBC4.0操作XML類型的字段(保存獲取xml數(shù)據(jù))的方法

    使用JDBC4.0操作XML類型的字段(保存獲取xml數(shù)據(jù))的方法

    jdbc4.0最重要的特征是支持xml數(shù)據(jù)類型,接下來(lái)通過(guò)本文重點(diǎn)給大家介紹如何使用jdbc4.0操作xml類型的字段,對(duì)jdbc4.0 xml相關(guān)知識(shí)感興趣的朋友一起看下吧
    2016-08-08
  • struts2實(shí)現(xiàn)文件上傳顯示進(jìn)度條效果

    struts2實(shí)現(xiàn)文件上傳顯示進(jìn)度條效果

    這篇文章主要為大家詳細(xì)介紹了struts2實(shí)現(xiàn)文件上傳顯示進(jìn)度條效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)(Run-Time Data Areas)

    Java JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)(Run-Time Data Areas)

    運(yùn)行時(shí)數(shù)據(jù)區(qū),是java虛擬機(jī)定義的在程序執(zhí)行期間使用的各種運(yùn)行時(shí)的數(shù)據(jù)區(qū),通過(guò)JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)圖例給大家展示的很詳細(xì),對(duì)JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • java實(shí)用驗(yàn)證碼的實(shí)現(xiàn)代碼

    java實(shí)用驗(yàn)證碼的實(shí)現(xiàn)代碼

    這篇文章主要為大家介紹了java實(shí)用驗(yàn)證碼的實(shí)現(xiàn)代碼,驗(yàn)證碼實(shí)際上就是隨機(jī)選擇一些字符以圖片的形式展現(xiàn)在頁(yè)面上,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Java8新特性-Lambda表達(dá)式詳解

    Java8新特性-Lambda表達(dá)式詳解

    Java 8 (又稱為 jdk 1.8) 是 Java 語(yǔ)言開(kāi)發(fā)的一個(gè)主要版本。Lambda 表達(dá)式,也可稱為閉包,它是推動(dòng) Java 8 發(fā)布的最重要新特性。本文通過(guò)詳細(xì)的代碼示例介紹了Java8新特性感興趣的朋友可以參考一下
    2023-04-04
  • java編譯命令基礎(chǔ)知識(shí)點(diǎn)

    java編譯命令基礎(chǔ)知識(shí)點(diǎn)

    在本篇文章里小編給大家整理的是一篇關(guān)于java編譯命令基礎(chǔ)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • Maven 搭建開(kāi)發(fā)環(huán)境

    Maven 搭建開(kāi)發(fā)環(huán)境

    這篇文章主要介紹了Maven 如何搭建開(kāi)發(fā)環(huán)境,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Spring基于注解配置AOP詳解

    Spring基于注解配置AOP詳解

    這篇文章主要介紹了Spring基于注解配置AOP詳解,Spring 的 AOP 功能是基于 AspectJ 實(shí)現(xiàn)的,支持使用注解聲明式定義 AOP 切面,Spring 基于注解配置 AOP 需要啟用 AspectJ 自動(dòng)代理功能,需要的朋友可以參考下
    2023-09-09
  • k8s部署的java服務(wù)添加idea調(diào)試參數(shù)的方法

    k8s部署的java服務(wù)添加idea調(diào)試參數(shù)的方法

    文章介紹了如何在K8S容器中的Java服務(wù)上進(jìn)行遠(yuǎn)程調(diào)試,包括配置Deployment、Service以及本地IDEA的調(diào)試設(shè)置,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • java8新特性教程之time包使用總結(jié)

    java8新特性教程之time包使用總結(jié)

    Java8新增了date和time的util包,下面這篇文章主要給大家介紹了關(guān)于java8新特性教程之time包使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01

最新評(píng)論

荃湾区| 金塔县| 敖汉旗| 新蔡县| 房产| 石台县| 昌宁县| 晴隆县| 天祝| 陕西省| 渭源县| 绵阳市| 德保县| 无为县| 合肥市| 浪卡子县| 彩票| 威宁| 怀集县| 南京市| 巴林右旗| 巴马| 会泽县| 清远市| 邯郸县| 长沙县| 永嘉县| 应用必备| 柳州市| 保亭| 玉环县| 防城港市| 微博| 桐庐县| 富蕴县| 蕉岭县| 延川县| 馆陶县| 长春市| 卫辉市| 华坪县|