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

Spring MVC核心功能異常處理機制原理詳解

開發 架構
如果在請求映射期間發生異常或從請求處理程序(例如@Controller)拋出異常,DispatcherServlet將委托給HandlerExceptionResolver bean鏈來解決異常并提供替代處理,這通常是一個錯誤響應。

概述

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

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

HandlerExceptionResolver

描述

SimpleMappingExceptionResolver

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

DefaultHandlerExceptionResolver

解析Spring MVC引發的異常,并將其映射為HTTP狀態碼。另見可選的ResponseEntityExceptionHandler和REST API異常。

ResponseStatusExceptionResolver

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

ExceptionHandlerExceptionResolver

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

異常解析器鏈

你可以在Spring配置中聲明多個HandlerExceptionResolver

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

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

MVC配置自動為默認的Spring MVC異常、@ResponseStatus注解的異常以及@ExceptionHandler方法聲明了內置的解析器。

容器錯誤頁配置

如果任何HandlerExceptionResolver都無法解決異常,因此需要傳播,或者響應狀態被設置為錯誤狀態(即4xx、5xx), Servlet容器可以在HTML中渲染一個默認的錯誤頁面。要定制容器的默認錯誤頁面,可以在web.xml中聲明錯誤頁面映射。如下面的例子所示:?

<error-page>
<location>/error</location>
</error-page>

根據前面的示例,當出現異常冒泡或響應具有錯誤狀態時,Servlet容器將在容器中向配置的URL(例如/error)發送錯誤。然后由DispatcherServlet處理,可能會將其映射到一個@Controller,這個@Controller可以實現為返回一個帶有模型的錯誤視圖名稱,或者渲染一個JSON響應,如下面的例子所示:?

@RestController
public class ErrorController {


@RequestMapping(path = "/error")
public Map<String, Object> handle(HttpServletRequest request) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("status", request.getAttribute("javax.servlet.error.status_code"));
map.put("reason", request.getAttribute("javax.servlet.error.message"));
return map;
}
}

錯誤處理原理

public class DispatcherServlet {
// 取得容器中所有的異常解析器
private List<HandlerExceptionResolver> handlerExceptionResolvers;
protected void initStrategies(ApplicationContext context) {
// 初始化異常解析器
initHandlerExceptionResolvers(context);
}
private void initHandlerExceptionResolvers(ApplicationContext context) {
this.handlerExceptionResolvers = null;
if (this.detectAllHandlerExceptionResolvers) {
// 獲取容器中所有的異常解析器
Map<String, HandlerExceptionResolver> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerExceptionResolver.class, true, false);
if (!matchingBeans.isEmpty()) {
this.handlerExceptionResolvers = new ArrayList<>(matchingBeans.values());
AnnotationAwareOrderComparator.sort(this.handlerExceptionResolvers);
}
}
}
}

發生異常后邏輯處理?

public class DispatcherServlet {
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
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) {
mv = ((ModelAndViewDefiningException) exception).getModelAndView();
} else {
// 獲取當前處理句柄HandlerMethod
Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
// 處理異常
mv = processHandlerException(request, response, handler, exception);
errorView = (mv != null);
}
}
if (mv != null && !mv.wasCleared()) {
render(mv, request, response);
}
}
protected ModelAndView processHandlerException(HttpServletRequest request, HttpServletResponse response,
@Nullable Object handler, Exception ex) throws Exception {
request.removeAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);
ModelAndView exMv = null;
if (this.handlerExceptionResolvers != null) {
// 遍歷在上面初始化查找到的所有異常解析器
for (HandlerExceptionResolver resolver : this.handlerExceptionResolvers) {
// 執行異常解析
exMv = resolver.resolveException(request, response, handler, ex);
if (exMv != null) {
break;
}
}
}
if (exMv != null) {
// ...
return exMv ;
}
// 如果所有的異常解析器都返回null,則直接拋出異常,該異常會被Servlet進行處理
throw ex ;
}
}

異常解析器默認配置

public class WebMvcAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(WebProperties.class)
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
}
}
public class WebMvcConfigurationSupport {
@Bean
public HandlerExceptionResolver handlerExceptionResolver(@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager) {
List<HandlerExceptionResolver> exceptionResolvers = new ArrayList<>();
// 處理自定義異常解析器的配置
configureHandlerExceptionResolvers(exceptionResolvers);
if (exceptionResolvers.isEmpty()) {
// 如果沒有異常解析器,那么添加默認的異常解析器
addDefaultHandlerExceptionResolvers(exceptionResolvers, contentNegotiationManager);
}
extendHandlerExceptionResolvers(exceptionResolvers);
HandlerExceptionResolverComposite composite = new HandlerExceptionResolverComposite();
// 設置高優先級,Composite成為統一的入口
composite.setOrder(0);
composite.setExceptionResolvers(exceptionResolvers);
return composite;
}
// 默認配置
protected final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers, ContentNegotiationManager mvcContentNegotiationManager) {
ExceptionHandlerExceptionResolver exceptionHandlerResolver = createExceptionHandlerExceptionResolver();
exceptionHandlerResolver.setContentNegotiationManager(mvcContentNegotiationManager);
exceptionHandlerResolver.setMessageConverters(getMessageConverters());
exceptionHandlerResolver.setCustomArgumentResolvers(getArgumentResolvers());
exceptionHandlerResolver.setCustomReturnValueHandlers(getReturnValueHandlers());
if (jackson2Present) {
exceptionHandlerResolver.setResponseBodyAdvice(Collections.singletonList(new JsonViewResponseBodyAdvice()));
}
if (this.applicationContext != null) {
exceptionHandlerResolver.setApplicationContext(this.applicationContext);
}
exceptionHandlerResolver.afterPropertiesSet();
exceptionResolvers.add(exceptionHandlerResolver);
ResponseStatusExceptionResolver responseStatusResolver = new ResponseStatusExceptionResolver();
responseStatusResolver.setMessageSource(this.applicationContext);
exceptionResolvers.add(responseStatusResolver);
exceptionResolvers.add(new DefaultHandlerExceptionResolver());
}
}

完畢!!!

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

2011-03-17 09:20:05

異常處理機制

2010-03-05 15:40:16

Python異常

2023-06-15 14:09:00

解析器Servlet容器

2011-07-21 15:20:41

java異常處理機制

2021-03-02 09:12:25

Java異常機制

2021-07-03 17:53:52

Java異常處理機制

2009-08-05 18:09:17

C#異常處理機制

2024-03-04 10:00:35

數據庫處理機制

2011-04-06 10:27:46

Java異常處理

2023-07-10 08:00:13

架構Rest返回值

2011-05-24 09:22:44

Spring3異常處理

2021-12-27 08:27:17

SpringMVC面試

2023-02-08 08:11:58

Spring容器核心事件

2023-03-08 08:54:59

SpringMVCJava

2009-09-02 18:34:28

C#鼠標事件

2021-03-25 07:44:39

C++異常處理開發技術

2022-04-12 08:09:22

Nodejs前端面試題

2024-04-23 00:00:00

SpringBoot監聽器

2015-12-28 11:25:51

C++異常處理機制

2010-01-27 17:38:58

Windows Emb
點贊
收藏

51CTO技術棧公眾號

在线免费观看成年人视频| 日韩av影视| 99久久久无码国产精品不卡| 国产极品嫩模在线观看91精品| 久久久三级国产网站| 日韩av电影在线免费播放| 香蕉网在线播放| 日本欧美韩国| 亚洲视频你懂的| 国产传媒一区二区三区| 日韩特黄一级片| 希岛爱理av免费一区二区| 色88888久久久久久影院按摩| 亚欧洲精品在线视频免费观看| 亚洲视频一区二区三区四区| 亚洲国产一区二区在线观看| 欧美精品一区在线观看| avav在线看| 在线视频1区2区| 国产一区二区三区观看| 69久久夜色精品国产69乱青草 | 欧美三级黄美女| 亚洲国模精品一区| 色婷婷综合网站| 91免费在线| 福利一区福利二区| 国产精品igao视频| 久久免费小视频| 欧洲美女日日| 亚洲国产精品久久久久| 最新中文字幕免费视频| 国产高清一区二区三区视频| 成人激情文学综合网| 国产福利视频一区二区| 欧美极品aaaaabbbbb| 禁果av一区二区三区| 337p亚洲精品色噜噜噜| 欧美日韩激情视频在线观看| 国产原厂视频在线观看| 久久久久成人黄色影片| 97在线中文字幕| 在线观看毛片视频| 国产亚洲精品自拍| 欧美另类在线观看| 黄瓜视频污在线观看| 视频一区在线| 欧美理论电影在线| 免费男同深夜夜行网站| 黄色污污视频在线观看| 亚洲欧洲日产国码二区| 日本精品一区二区三区视频| 亚洲国产视频一区二区三区| 久久国产日韩欧美精品| 国产精品久久久久77777| 永久免费看片在线播放| 精品视频免费| 亚洲午夜精品久久久久久久久久久久| 动漫美女无遮挡免费| 九色成人搞黄网站| 色婷婷久久综合| a在线视频观看| av蜜臀在线| 一区二区三区日韩欧美| 黄色一级片网址| 69久久精品| 国产精品视频你懂的| 日韩欧美在线观看强乱免费| 日韩a级作爱片一二三区免费观看| 成人av在线资源网| 国产欧美欧洲| 欧美特黄一级视频| 久久99国产乱子伦精品免费| 国产精品丝袜久久久久久高清| www亚洲视频| 久久99伊人| 日产精品久久久一区二区福利| 日本中文字幕第一页| 香蕉久久a毛片| 欧美黄色www| 国产精品成人免费一区二区视频| 亚洲精品影院在线观看| 97精品伊人久久久大香线蕉| 国产欧美日韩另类| 91精品综合久久久久久久久久久 | 国产一区二区三区四区老人| 午夜伦理精品一区| 国产偷人爽久久久久久老妇app| 久草这里只有精品视频| 国产精品果冻传媒潘| 蜜桃视频在线播放| 国产精品福利影院| 国产96在线 | 亚洲| av在线日韩| 精品国产乱码久久久久久浪潮| 黄色性生活一级片| 五月天久久久| 57pao成人永久免费视频| 在线观看免费高清视频| 99在线精品视频| 一区二区三区电影| 中文不卡1区2区3区| 91精品国产综合久久小美女| 亚洲av无码一区二区三区网址 | 好吊色视频988gao在线观看| 成人性生活视频| 欧美一区国产二区| 人妻一区二区视频| 亚洲国产精品一区| 成人性生交大片免费看视频直播 | 亚洲性夜色噜噜噜7777| 欧美黑人一级片| 日韩av一级片| 精品日本一区二区三区| 黄色网在线播放| 日韩欧美在线视频观看| 中文字幕一区二区三区人妻在线视频 | 日本中文字幕在线播放| 精品毛片网大全| 天天爽夜夜爽视频| 日韩欧美伦理| 欧美专区在线播放| 人人妻人人澡人人爽人人欧美一区 | 国产精品久久久久久久久久直播| avtt在线播放| 欧美性猛交xxxx乱大交极品| 女同性αv亚洲女同志| 999国产精品999久久久久久| 国产精品www色诱视频| 色婷婷av一区二区三区之e本道| 亚洲欧洲国产专区| www亚洲成人| 国产区精品区| 68精品国产免费久久久久久婷婷 | 亚洲日韩中文字幕在线播放| 精品在线视频观看| 国产精品主播直播| 色香蕉在线观看| 国产一区精品福利| 色婷婷综合久久久久中文字幕1| 69亚洲精品久久久蜜桃小说| 99国产精品久久久久| 91黄色在线看| 成人香蕉社区| 久久人人爽人人爽人人片av高清| 亚洲精品国偷拍自产在线观看蜜桃| ...av二区三区久久精品| 成人性生生活性生交12| jizzjizz欧美69巨大| 日韩av大片在线| 男人的天堂在线免费视频| 亚洲一区二区三区四区的| 精产国品一区二区三区| 国产一区二区三区四区老人| 国产欧美日韩一区| 麻豆视频在线看| 亚洲奶大毛多的老太婆| 无码人妻丰满熟妇区bbbbxxxx| 91美女视频网站| 一本久道综合色婷婷五月| 国产精品免费不| 国产精品亚发布| 国产原创在线观看| 精品捆绑美女sm三区| 国产精品国产三级国产专区52| 2020国产精品自拍| 男人搞女人网站| 日韩国产欧美一区二区| 91亚洲精品在线| 白白色在线观看| 亚洲欧美日韩精品| 中文字幕在线播出| 亚洲日本在线a| 在线观看一区二区三区四区| 亚洲少妇一区| 亚洲v国产v在线观看| 电影一区二区三区久久免费观看| 欧美激情在线狂野欧美精品| 婷婷在线免费观看| 91国产视频在线观看| 天堂а√在线中文在线鲁大师| 国产精品一区一区三区| 日本www在线播放| 久久一本综合| 国产一级二级三级精品| 岛国精品在线| 久久久久久久爱| 国产粉嫩一区二区三区在线观看| 6080午夜不卡| 天天插天天操天天干| 国产精品沙发午睡系列990531| 久久久国产精品久久久| 久久福利影视| 日本一道在线观看| 伊人久久大香线蕉综合网蜜芽| 成人性生交xxxxx网站| 人在线成免费视频| 久久精品视频一| 香蕉视频网站在线| 7777精品伊人久久久大香线蕉 | 色呦呦久久久| 国产亚洲xxx| 亚洲精品久久久狠狠狠爱 | 国产老妇伦国产熟女老妇视频| 亚洲一级二级三级| 国产三级aaa| 91社区在线播放| 欧洲成人午夜精品无码区久久| 日韩国产在线观看| 免费观看国产精品视频| 香蕉综合视频| 日韩精品资源| 欧美调教在线| 91精品国自产在线观看| 免费日韩成人| 欧美专区中文字幕| √最新版天堂资源网在线| 久久精品国产一区| 川上优的av在线一区二区| 亚洲а∨天堂久久精品9966| 国产精品无码久久久久成人app| 色婷婷综合五月| 国产稀缺真实呦乱在线| 一区二区三区视频在线看| 91免费公开视频| 中文字幕精品三区| 精品无码国产污污污免费网站| zzijzzij亚洲日本少妇熟睡| 久久人人爽人人片| 国产专区综合网| 奇米视频7777| 男女视频一区二区| 亚洲精品一二三四五区| 久久国产精品久久w女人spa| 女人和拘做爰正片视频| 一区二区国产精品| 亚洲人成无码网站久久99热国产| 欧美日本一区二区视频在线观看| 9999在线观看| 亚洲激情久久| 黄色片免费在线观看视频| 91精品国产乱码久久久久久| 亚洲欧美日韩国产yyy| 日韩欧美视频专区| 中文字幕日韩精品一区二区| 99久久久久国产精品| 综合久久国产| 国产精品久久占久久| 黄色网zhan| 欧美福利影院| 给我免费播放片在线观看| 亚洲午夜一级| 日韩网站在线免费观看| 国产欧美日韩一级| 国语对白做受xxxxx在线中国| 久久亚洲视频| 簧片在线免费看| 国产专区综合网| 欧洲成人午夜精品无码区久久| 成人午夜视频在线观看| 波多野结衣影院| 久久久高清一区二区三区| 奇米网一区二区| 亚洲色图欧美在线| 国产亚洲精品av| 黑人精品xxx一区| 日本视频免费观看| 在线播放一区二区三区| 性猛交xxxx乱大交孕妇印度| 亚洲国产精品成人av| 国产一区二区影视| 久久伊人精品一区二区三区| a级大胆欧美人体大胆666| 欧美中文字幕在线播放| 黄色成人小视频| 亚洲综合在线小说| 欧美日韩直播| 先锋影音亚洲资源| 黄色亚洲精品| 久久99999| 国产精品一区二区久久精品爱涩| 国产高清成人久久| 中文字幕不卡三区| 免费视频一二三区| 色婷婷激情综合| 精品久久人妻av中文字幕| 日韩精品免费观看| 色欧美激情视频在线| 久久久久久久影院| 中韩乱幕日产无线码一区| 国产高清在线一区| 日韩欧美视频专区| 欧美精品久久久久久久自慰| 麻豆久久一区二区| 怡红院一区二区| 国产精品高清亚洲| 依依成人综合网| 91精品国产乱码久久蜜臀| 飘雪影院手机免费高清版在线观看 | 三区四区在线视频| 97成人精品区在线播放| 精品国产伦一区二区三区观看说明 | 午夜激情在线观看视频| 国产99久久久国产精品免费看| 亚洲国产天堂av| 亚洲国产精品欧美一二99| 正在播放木下凛凛xv99| 亚洲精品美女免费| fc2ppv国产精品久久| 国产精品男人的天堂| 欧美爱爱网站| 综合国产精品久久久| 日精品一区二区| 欧美大喷水吹潮合集在线观看| 亚洲三级免费电影| 一区二区视频在线免费观看| 亚洲精品国产成人| 新版中文在线官网| 国产欧美精品在线播放| 国产日产精品一区二区三区四区的观看方式 | 国产精品va在线观看视色 | av日韩在线看| 久久国产人妖系列| 中文字幕免费在线看线人动作大片| 五月天丁香久久| 黄色小视频免费在线观看| 久久视频免费观看| 精品久久在线| 三区精品视频| 日韩高清欧美激情| 欧美偷拍一区二区三区| 日韩欧美黄色动漫| 天天插天天干天天操| 久久久久久久久亚洲| 91久久精品无嫩草影院| 欧美大片免费播放| 精品在线播放午夜| 91n在线视频| 欧美高清一级片在线| 免费在线看黄网站| 91精品久久久久久久久中文字幕| 日韩aaaa| 五月婷婷丁香色| 国产精品久久久久精k8 | 亚洲精品国产精品国产| 精品视频第一区| 亚洲尤物在线| 波多野在线播放| 欧美日韩色综合| 精品自拍一区| 99c视频在线| 亚洲国产激情| 美女脱光内衣内裤| 欧洲精品一区二区| 免费黄色电影在线观看| 亚洲精品日韩av| 一区精品久久| 亚洲第一黄色网址| 在线免费不卡电影| 麻豆视频网站在线观看| 成人久久久久爱| 好吊日精品视频| 日韩成人av一区二区| 欧美特级www| av在线播放av| 91在线中文字幕| 国语自产精品视频在线看8查询8| 黑森林av导航| 日韩欧美在线视频日韩欧美在线视频 | 亚洲乱亚洲乱妇无码| av免费在线一区| 自拍偷拍一区二区三区| 成人丝袜高跟foot| 羞羞影院体验区| 日韩在线高清视频| av综合网址| 国产a级片免费观看| 亚洲三级免费观看| 五月婷婷开心中文字幕| 国产精品视频免费在线观看| 综合一区av| 国产精品亚洲无码| 91精品国产综合久久精品图片| 欧美性video| 欧美久久在线| 国产一区二区视频在线| 国产一区二区99| www.亚洲成人| 老汉色老汉首页av亚洲| 不卡的av中文字幕| 亚洲大片精品永久免费| 超碰97在线免费观看| 电影午夜精品一区二区三区| 噜噜噜躁狠狠躁狠狠精品视频| 日本午夜在线观看| 亚洲精品视频播放| 亚洲2区在线| 簧片在线免费看| 精品久久久一区| 日本精品600av| 午夜一区二区三区|