您好,登錄后才能下訂單哦!
這篇文章給大家介紹Spring MVC異常處理機制,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
核心接口
這個處理機制在Spring是以HandlerExceptionResolver接口為核心的,該接口只有一個處理方法:
ModelAndView resolveException( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
對于返回值 ModelAndView,有如下約定:
ModelAndView 指向一個頁面
空的ModelAndView,表示異常已經在 HandlerExceptionResolver內部處理完成
null表示異常未處理,需要繼續執行其它的HandlerExceptionResolver
你可以通過聲明多個HandlerExceptionResolver bean,并實現Ordered接口,來組成一個有順序的HandlerExceptionResolver chain來處理異常。
Spring已經提供了以下幾種實現:
SimpleMappingExceptionResolver 處理邏輯是根據Exception的class name映射成指定的error page。
DefaultHandlerExceptionResolver 是根據異常的類型轉成http 狀態碼。
ResponseStatusExceptionResolver 是根據把異常和狀態碼通過@ResponseStatus綁定,當有異常拋出時,最終給客戶端返回對應的狀態碼。
ExceptionHandlerExceptionResolver 是處理@ExceptionHandler的解析類,當有異常發生時,交給@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; } }
自定義異常處理器,可以實現HandlerExceptionResolver,也可以繼承AbstractHandlerExceptionResolver類,實現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 搭配內容協商來轉換消息體.
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異常處理機制就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。