欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring MVC異常處理機制示例詳解

 更新時間:2019年11月07日 08:31:20   作者:張濤tom  
這篇文章主要給大家介紹了關于Spring MVC異常處理機制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring MVC具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

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

核心接口

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

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

對于返回值 ModelAndView,有如下約定:

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

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

Spring已經提供了以下幾種實現(xiàn):

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

處理邏輯

對ExceptionResolver的處理是在DispatcherServlet中進行的

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

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

在DispatcherServlet初始化的時候同時對handlerExceptionResolvers進行了初始化

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

在processHandlerException方法完成的對 HandlerExceptionResolver chain的調用,返回值不為null,即視作處理完成

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

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

這里重點說下功能最為豐富的ExceptionHandlerExceptionResolver

通過@ExceptionHandler注解的方法,被視為異常處理方法,是通過ExceptionHandlerExceptionResolver來處理。該方法支持的參數類型有:

  • 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  可以通過message converters 搭配內容協(xié)商來轉換消息體.
  • HttpEntity<?> or ResponseEntity<?>
  • void 如果直接通過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中的異常處理邏輯,如有不對的地方,歡迎拍磚。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • SpringCloud整合Activiti過程中的踩坑記錄

    SpringCloud整合Activiti過程中的踩坑記錄

    由于項目需要,最近開始在項目Spring boot中集成工作流引擎Activiti,由于第一次集成,一路上步步都是坑,所以這篇文章主要給大家介紹了關于SpringCloud整合Activiti過程中所遇到的踩坑記錄,需要的朋友可以參考下
    2021-09-09
  • 解析Java 泛型什么情況下不能使用

    解析Java 泛型什么情況下不能使用

    這篇文章主要介紹了解析Java 泛型什么情況下不能使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Spring事件監(jiān)聽機制觀察者模式詳解

    Spring事件監(jiān)聽機制觀察者模式詳解

    這篇文章主要為大家介紹了Spring事件監(jiān)聽機制觀察者模式實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 手把手教你寫Maven的archetype項目腳手架

    手把手教你寫Maven的archetype項目腳手架

    本文主要介紹了Maven的archetype項目腳手架,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JAVA使用Gson解析json數據實例解析

    JAVA使用Gson解析json數據實例解析

    JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,易于閱讀和編寫,同時也易于機器解析和生成。接下來通過本文給大家介紹JAVA使用Gson解析json數據實例解析,需要的朋友參考下吧
    2016-03-03
  • 詳解Java 微服務架構

    詳解Java 微服務架構

    這篇文章主要介紹了Java 微服務架構的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • java線程之用Thread類創(chuàng)建線程的方法

    java線程之用Thread類創(chuàng)建線程的方法

    本篇文章介紹了,Thread類創(chuàng)建線程的方法。需要的朋友參考下
    2013-05-05
  • 基于mybatis注解動態(tài)sql中foreach工具的方法

    基于mybatis注解動態(tài)sql中foreach工具的方法

    這篇文章主要介紹了mybatis注解動態(tài)sql中foreach工具方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 詳談Java靜態(tài)動態(tài)的問題

    詳談Java靜態(tài)動態(tài)的問題

    下面小編就為大家?guī)硪黄斦凧ava靜態(tài)動態(tài)的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 更簡單更高效的Mybatis?Plus最新代碼生成器AutoGenerator

    更簡單更高效的Mybatis?Plus最新代碼生成器AutoGenerator

    這篇文章主要為大家介紹了更簡單更高效的Mybatis?Plus最新代碼生成器AutoGenerator使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02

最新評論