日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring 異常處理的各種姿勢(shì)總結(jié)

瀏覽:207日期:2023-09-06 10:53:11

本文實(shí)例總結(jié)了Spring 異常處理的各種姿勢(shì)。分享給大家供大家參考,具體如下:

1. 前言

統(tǒng)一的異常處理對(duì)于應(yīng)用的重要性不言而喻。今天我們來(lái)介紹一下 Spring 如何來(lái)進(jìn)行統(tǒng)一的 Rest 異常處理。同時(shí)我們也會(huì)簡(jiǎn)單比較一下它們之間的優(yōu)劣。

2. @Controller 結(jié)合 @ExceptionHandler

在控制器中聲明一個(gè)方法然后用 @ExceptionHandler 注解標(biāo)記即可:

@Controller @RequestMapping('/test') public class TestController { @RequestMapping('/err') @ResponseBody public Object demo1(){ int i = 1 / 0; return new Date(); } @ExceptionHandler({RuntimeException.class}) public ModelAndView fix(Exception ex){ System.out.println(ex.getMessage()); return new ModelAndView('error',new ModelMap('ex',ex.getMessage())); } }

優(yōu)點(diǎn):

優(yōu)先級(jí)最高。 @ExceptionHandler 標(biāo)記的方法返回值類(lèi)型支持多種。可以是視圖,也可以是 json 等。

缺點(diǎn):

一個(gè) Controller 中的 @ExceptionHandler 注解上的異常類(lèi)型不能出現(xiàn)相同的,否則運(yùn)行時(shí)拋異常。 需要顯式的聲明處理的異常類(lèi)型。 作用域僅僅是該 Controller 并不是真正意義上的全局異常。如果要想作用于全局需要將其放入所有控制器的父類(lèi)中。3. @ControllerAdvice 結(jié)合 @ExceptionHandler

這是 2. 的改進(jìn)型,通過(guò)定義 @ControllerAdvice 類(lèi)并在方法上標(biāo)記 @ExceptionHandler ,達(dá)到了全局異常處理的目的:

@ControllerAdvice public class TestController { @ExceptionHandler({RuntimeException.class}) public ModelAndView fix(Exception ex){ System.out.println(ex.getMessage()); return new ModelAndView('error',new ModelMap('ex',ex.getMessage())); } }

優(yōu)點(diǎn):

全局的異常處理。 完全控制響應(yīng)的主體以及狀態(tài)碼 將多個(gè)異常映射到同一方法,以一起處理,并且它充分利用了更新的 Restful ResponseEntity 響應(yīng)

缺點(diǎn):

一個(gè) Controller 中的 @ExceptionHandler 注解上的異常類(lèi)型不能出現(xiàn)相同的,否則運(yùn)行時(shí)拋異常。 需要顯式的聲明處理的異常類(lèi)型。

一般情況下也建議使用該方式進(jìn)行異常處理。大多數(shù)情況下都是兼容的。

4. HandlerExceptionResolver 接口

實(shí)現(xiàn) HandlerExceptionResolver 接口,這里我們繼承其抽象實(shí)現(xiàn) AbstractHandlerExceptionResolver :

@Component public class RestResponseStatusExceptionResolver extends AbstractHandlerExceptionResolver { @Override protected ModelAndView doResolveException( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { if (ex instanceof IllegalArgumentException) { return handleIllegalArgument((IllegalArgumentException) ex, response, handler); } //todo more exception } catch (Exception handlerException) {//todo } return null; } private ModelAndView handleIllegalArgument(IllegalArgumentException ex, HttpServletResponse response) throws IOException { response.sendError(HttpServletResponse.SC_CONFLICT); String accept = request.getHeader(HttpHeaders.ACCEPT); //todo more response return new ModelAndView(); } }

優(yōu)點(diǎn):

這是一個(gè)全局的異常處理器。 這種方式全局異常處理返回JSP、velocity 等模板視圖比較方便。 支持多種格式的響應(yīng),雖然覆寫(xiě)的方法返回的是 ModelAndView 但是因?yàn)閰?shù)中有 HttpServletResponse, 我們可以利用它來(lái)進(jìn)行定制響應(yīng)結(jié)果。例如,如果客戶(hù)端要求輸入application / json,那么在出現(xiàn)錯(cuò)誤情況時(shí),我們要確保我們返回一個(gè)以application / json編碼的響應(yīng)。

缺點(diǎn):

我們需要與低級(jí)的 HttpServletResponse 交互才能實(shí)現(xiàn)各種形式的響應(yīng)體。 優(yōu)先級(jí)比較低5. Spring Boot 中的異常處理

如果你用的框架是 Spring Boot 。 我們還可以用它獨(dú)特的處理方式。優(yōu)點(diǎn)是屏蔽了低級(jí)的API,缺點(diǎn)也比較明顯,無(wú)法捕捉到具體的異常。

5.1 實(shí)現(xiàn) ErrorController

Spring Boot 在默認(rèn)情況下,提供了 /error 映射來(lái)處理所有錯(cuò)誤,在 Servlet 容器里注冊(cè)了全局的錯(cuò)誤頁(yè)面(Whitelabel Error Page)并返回客戶(hù)端。通過(guò)實(shí)現(xiàn) ErrorController 接口并注冊(cè)為 Bean。這里不再舉例。可參考 BasicErrorController 。

5.2 添加 ErrorAttributes

我們也可以添加 ErrorAttributes 類(lèi)型的 Bean 來(lái)替換替換默認(rèn)的異常處理。

@Component public class MyCustomErrorAttributes extends DefaultErrorAttributes { @Override public Map<String, Object> getErrorAttributes( WebRequest webRequest, boolean includeStackTrace) { Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace); errorAttributes.put('locale', webRequest.getLocale() .toString()); errorAttributes.remove('error'); //todo your business return errorAttributes; } }5.3 繼承基類(lèi) BasicErrorController

Spring Boot 自動(dòng)配置還提供了實(shí)現(xiàn) ErrorController 接口異常處理的基類(lèi) BasicErrorController,默認(rèn)是處理 text/html類(lèi)型請(qǐng)求的錯(cuò)誤,可以繼承該基類(lèi)自定義處理更多的請(qǐng)求類(lèi)型,添加公共方法并使用 @RequestMapping 注解的 produce屬性指定處理類(lèi)型。

@Component public class MyErrorController extends BasicErrorController { public MyErrorController(ErrorAttributes errorAttributes) { super(errorAttributes, new ErrorProperties()); } @RequestMapping(produces = MediaType.APPLICATION_XML_VALUE) public ResponseEntity<Map<String, Object>> xmlError(HttpServletRequest request) {//todo your business } }6. Spring 5 的 ResponseStatusException

另外在最新的 Spring 5 中你還可以通過(guò) 拋出 ResponseStatusException 異常來(lái)進(jìn)行處理。

好處:

使用比較方便 一種類(lèi)型,多種狀態(tài)代碼:一種異常類(lèi)型可以導(dǎo)致多種不同的響應(yīng)。與@ExceptionHandler相比,這減少了緊密耦合 我們將不必創(chuàng)建那么多的自定義異常類(lèi) 由于可以通過(guò)編程方式創(chuàng)建異常,因此可以更好地控制異常處理

缺點(diǎn):

沒(méi)有統(tǒng)一的異常處理方式,強(qiáng)制執(zhí)行某些應(yīng)用程序范圍的約定更加困難 可能會(huì)有大量的重復(fù)代碼。7. 總結(jié)

我們對(duì)常用的、不常用的 Spring 處理異常的方式進(jìn)行了總結(jié)和優(yōu)劣上的分析。 相信你可以從中找到適合你的處理方式。如果對(duì)你有用請(qǐng)幫忙點(diǎn)一個(gè)贊,您的鼓勵(lì),我的動(dòng)力!

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Spring框架入門(mén)與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品1区2区3区4区| 国产精品一站二站| 亚洲毛片网站| 久久影院一区二区三区| 另类小说一区二区三区| 精品国产亚洲一区二区三区大结局 | 久久字幕精品一区| 最新亚洲国产| 久久久久久久久久久9不雅视频| 伊人久久亚洲热| 欧美手机在线| 日韩伦理在线一区| 91精品国产自产精品男人的天堂 | 欧美日韩一区二区三区在线电影| 四虎国产精品免费观看| 不卡在线一区二区| 国产福利资源一区| 久久久五月天| 久久亚洲风情| 午夜宅男久久久| 免费黄网站欧美| 欧美国产亚洲精品| 日韩成人精品一区| 性欧美精品高清| 久久蜜桃精品| 日韩精品2区| 国产亚洲网站| 国产精品伦理久久久久久| 一本综合精品| а√天堂中文在线资源8| 亚洲精品在线二区| 亚洲午夜精品久久久久久app| 国产精品亚洲产品| 亚洲午夜91| 国产精品一二| 999在线观看精品免费不卡网站| 日韩精品免费视频人成| 日韩1区2区日韩1区2区| 成人福利av| 中文无码日韩欧| 久久久国产亚洲精品| 精品久久国产一区| 日韩区欧美区| 久久福利毛片| 国产一区二区三区自拍| 国产婷婷精品| 综合激情网...| 免费日韩精品中文字幕视频在线| 久久久五月天| 国产a亚洲精品| 久久一区二区中文字幕| 亚洲精品国模| 亚洲一级少妇| 欧美日韩激情| 久久人人97超碰国产公开结果| 99国产精品| 日韩视频在线一区二区三区| 久久精品99久久无色码中文字幕| 国产剧情一区| 日韩精品一二三| 在线日韩视频| 日本国产精品| 亚洲一区久久| 另类亚洲自拍| 日韩三级精品| 欧美精品国产| 精品91福利视频| 国产精品毛片视频| 91精品国产乱码久久久久久久| 91精品高清| 久久一区亚洲| 欧美日韩国产综合网| 一区二区三区四区精品视频| 国产精成人品2018| 一区二区视频欧美| 日韩国产欧美三级| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产成人精品福利| 色乱码一区二区三区网站| 国产一区二区中文| 综合激情婷婷| 国产精品99一区二区三区| 亚洲一区二区免费看| 久久精品国产999大香线蕉| 免费在线观看成人| 欧美一级二区| 国产成人调教视频在线观看| 蜜桃精品在线| 中文字幕av亚洲精品一部二部| 国产精品久久久久久av公交车| 日韩成人精品一区| 美女久久网站| 国产精品久久久一区二区| 精品一区二区三区在线观看视频| 亚洲精品伊人| 一区二区三区四区精品视频| 久久精品亚洲人成影院 | 亚洲一区二区三区高清不卡| 奇米色欧美一区二区三区| 亚州欧美在线| 国产欧美另类| 三级一区在线视频先锋| 一区二区日韩免费看| 欧美在线网站| 在线一区二区三区视频| 亚洲精品一区二区在线看| 久久精品天堂| 午夜一级在线看亚洲| 日本电影久久久| 97国产精品| 日韩精品乱码av一区二区| 捆绑调教美女网站视频一区| 亚洲欧洲一区| 成年男女免费视频网站不卡| 综合五月婷婷| 黄色免费成人| 97精品在线| 亚洲黄色免费看| 国产精品igao视频网网址不卡日韩| 日产精品一区| 精品国产乱码久久久久久1区2匹| 国产欧美在线观看免费| 尤物网精品视频| 蜜桃久久精品一区二区| 免费美女久久99| 亚洲aa在线| 丝袜美腿高跟呻吟高潮一区| 综合日韩av| 久久av中文| 免费美女久久99| 国产一区二区三区四区五区| 久久久蜜桃一区二区人| 蜜臀久久99精品久久久画质超高清 | 成人看片网站| 一区二区亚洲视频| 欧美在线亚洲| 中文字幕一区二区av| 欧美日韩激情| 伊人久久婷婷| 亚洲18在线| 欧美一区影院| av在线日韩| 亚洲精品一区二区在线播放∴| 国产欧美日韩一区二区三区在线| 精品国产一区二| 激情综合激情| 视频一区二区不卡| 精品中文在线| 亚洲精品第一| 四虎国产精品免费久久| 国产精品久久免费视频| 亚洲涩涩在线| a日韩av网址| 激情欧美亚洲| 国产亚洲电影| 日韩精品一级| 国产精品88久久久久久| 国产精品中文字幕制服诱惑| 精品少妇av| 黄色网一区二区| 久久精品国产成人一区二区三区| 亚洲精品在线国产| 国产精品流白浆在线观看| 日韩电影免费网址| 国产精品嫩草99av在线| 三级一区在线视频先锋| 国产亚洲一区二区三区啪| 国产拍在线视频| 91伊人久久| 激情综合网站| 国产一区二区三区四区| 亚洲免费影视| 亚洲一区久久| 日韩免费小视频| 麻豆mv在线观看| 免费高潮视频95在线观看网站| 亚洲一区欧美| 日韩亚洲精品在线| 国产视频一区免费看| 天堂成人免费av电影一区| 蜜桃视频一区二区三区在线观看| 免费久久精品| 清纯唯美亚洲综合一区| 99视频精品视频高清免费| 欧美成人a交片免费看| 午夜日韩av| 欧美成人午夜| 91亚洲国产| 噜噜噜久久亚洲精品国产品小说| 久热精品在线| 日韩av中文字幕一区二区| 日韩和欧美的一区| 国产精品任我爽爆在线播放 | 亚洲精品自拍| 亲子伦视频一区二区三区| 91麻豆国产自产在线观看亚洲| 国产免费久久| 久久久久免费| 国产精品久久久久久久免费观看| 亚洲无线一线二线三线区别av|