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

你以為Spring Boot統一異常處理能攔截所有的異常?

開發 架構
通常我們在Spring Boot中設置的統一異常處理只能處理Controller拋出的異常。有些請求還沒到Controller就出異常了,而這些異常不能被統一異常捕獲,例如Servlet容器的某些異常。

[[396961]]

通常我們在Spring Boot中設置的統一異常處理只能處理Controller拋出的異常。有些請求還沒到Controller就出異常了,而這些異常不能被統一異常捕獲,例如Servlet容器的某些異常。今天我在項目開發中就遇到了一個,這讓我很不爽,因為它返回的錯誤信息格式不能統一處理,我決定找個方案解決這個問題。

ErrorPageFilter

Whitelabel Error Page

這類圖相信大家沒少見,Spring Boot 只要出錯,體現在頁面上的就是這個。如果你用Postman之類的測試出了異常則是:

  1.   "timestamp""2021-04-29T22:45:33.231+0000"
  2.   "status": 500, 
  3.   "message""Internal Server Error"
  4.   "path""foo/bar" 

這個是怎么實現的呢?Spring Boot在啟動時會注冊一個ErrorPageFilter,當Servlet發生異常時,該過濾器就會攔截處理,將異常根據不同的策略進行處理:當異常已經在處理的話直接處理,否則轉發給對應的錯誤頁面。有興趣的可以去看下源碼,邏輯不復雜,這里就不貼了。

另外當一個 Servlet 拋出一個異常時,處理異常的Servlet可以從HttpServletRequest里面得到幾個屬性,如下:

異常屬性

我們可以從上面的幾個屬性中獲取異常的詳細信息。

默認錯誤頁面

通常Spring Boot出現異常默認會跳轉到/error進行處理,而/error的相關邏輯則是由BasicErrorController實現的。

  1. @Controller 
  2. @RequestMapping("${server.error.path:${error.path:/error}}"
  3. public class BasicErrorController extends AbstractErrorController { 
  4.     //返回錯誤頁面 
  5.   @RequestMapping(produces = MediaType.TEXT_HTML_VALUE) 
  6.  public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { 
  7.   HttpStatus status = getStatus(request); 
  8.   Map<String, Object> model = Collections 
  9.     .unmodifiableMap(getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.TEXT_HTML))); 
  10.   response.setStatus(status.value()); 
  11.   ModelAndView modelAndView = resolveErrorView(request, response, status, model); 
  12.   return (modelAndView != null) ? modelAndView : new ModelAndView("error", model); 
  13.  } 
  14.     // 返回json 
  15.  @RequestMapping 
  16.  public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { 
  17.   HttpStatus status = getStatus(request); 
  18.   if (status == HttpStatus.NO_CONTENT) { 
  19.    return new ResponseEntity<>(status); 
  20.   } 
  21.   Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL)); 
  22.   return new ResponseEntity<>(body, status); 
  23.  }   
  24. // 其它省略 

而對應的配置:

  1. @Bean 
  2. @ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT
  3. public BasicErrorController basicErrorController(ErrorAttributes errorAttributes, 
  4.       ObjectProvider<ErrorViewResolver> errorViewResolvers) { 
  5.    return new BasicErrorController(errorAttributes, this.serverProperties.getError(), 
  6.          errorViewResolvers.orderedStream().collect(Collectors.toList())); 

所以我們只需要重新實現一個ErrorController并注入Spring IoC就可以替代默認的處理機制。而且我們可以很清晰的發現這個BasicErrorController不但是ErrorController的實現而且是一個控制器,如果我們讓控制器的方法拋異常,肯定可以被自定義的統一異常處理。所以我對BasicErrorController進行了改造:

  1. @Controller 
  2. @RequestMapping("${server.error.path:${error.path:/error}}"
  3. public class ExceptionController extends AbstractErrorController { 
  4.  
  5.  
  6.     public ExceptionController(ErrorAttributes errorAttributes) { 
  7.         super(errorAttributes); 
  8.     } 
  9.  
  10.  
  11.     @Override 
  12.     @Deprecated 
  13.     public String getErrorPath() { 
  14.         return null
  15.     } 
  16.  
  17.     @RequestMapping(produces = MediaType.TEXT_HTML_VALUE) 
  18.     public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { 
  19.         throw new RuntimeException(getErrorMessage(request)); 
  20.     } 
  21.  
  22.     @RequestMapping 
  23.     public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { 
  24.         throw new RuntimeException(getErrorMessage(request)); 
  25.     } 
  26.  
  27.     private String getErrorMessage(HttpServletRequest request) { 
  28.         Object code = request.getAttribute("javax.servlet.error.status_code"); 
  29.         Object exceptionType = request.getAttribute("javax.servlet.error.exception_type"); 
  30.         Object message = request.getAttribute("javax.servlet.error.message"); 
  31.         Object path = request.getAttribute("javax.servlet.error.request_uri"); 
  32.         Object exception = request.getAttribute("javax.servlet.error.exception"); 
  33.  
  34.         return String.format("code: %s,exceptionType: %s,message: %s,path: %s,exception: %s"
  35.                 code, exceptionType, message, path, exception); 
  36.     } 

 

直接拋異常,簡單省力!凡是這里捕捉的到的異常大部分還沒有經過Controller,我們通過ExceptionController中繼也讓這些異常被統一處理,保證整個應用的異常處理對外保持一個統一的門面。

 

責任編輯:武曉燕 來源: 碼農小胖哥
相關推薦

2025-02-13 00:34:22

Spring對象系統

2017-05-18 14:14:25

過濾器Spring ClouZuul

2022-04-08 16:27:48

SpringBoot異常處理

2017-07-31 15:47:50

Zuul統一處理

2017-05-19 15:13:05

過濾器Spring ClouZuul

2023-11-28 14:32:04

2024-09-25 08:10:00

Spring后端

2021-04-20 10:50:38

Spring Boot代碼Java

2019-08-22 14:02:00

Spring BootRestful APIJava

2024-08-09 08:25:32

Spring流程注解

2023-09-24 13:55:42

Spring應用程序

2022-10-26 07:14:25

Spring 6Spring業務

2023-07-10 08:00:13

架構Rest返回值

2011-05-24 09:22:44

Spring3異常處理

2022-05-30 08:03:06

后端參數校驗異常處理

2020-03-16 17:20:02

異常處理Spring Boot

2020-03-11 08:00:00

.NET異常處理編程語言

2023-11-30 07:00:56

SpringBoot處理器

2024-10-28 08:32:22

統一接口響應SpringBoot響應框架

2022-03-15 21:38:29

sentry微服務監控
點贊
收藏

51CTO技術棧公眾號

女同性恋一区二区| 国产精自产拍久久久久久| 大尺度做爰床戏呻吟舒畅| 亚洲黄色免费看| 国产精品久久久久9999吃药| 99久久自偷自偷国产精品不卡| 在线观看黄网站| 日产午夜精品一线二线三线| 日韩一二三区视频| 国产精品乱码久久久久| 四虎影院观看视频在线观看| 久久综合九色综合欧美亚洲| 成人国产精品久久久久久亚洲| 国产精品99re| 久久高清精品| 日韩精品在线看| 性鲍视频在线观看| 人人鲁人人莫人人爱精品| 97欧美在线视频| 精品国产伦一区二区三区免费 | 91精品91| 亚洲欧洲日韩国产| 国产国语老龄妇女a片| 精品福利在线| 在线一区二区三区四区五区| 亚洲精品蜜桃久久久久久| 最新av网站在线观看| 成人av午夜影院| 97久草视频| 国产精品老熟女视频一区二区| 伊人精品一区| 精品对白一区国产伦| 福利视频999| 日韩高清成人| 欧美网站在线观看| 热99这里只有精品| 色呦呦在线视频| 亚洲欧洲韩国日本视频| 日韩不卡av| 黄色av网站在线| 91女厕偷拍女厕偷拍高清| 成人av影视在线| 97在线视频人妻无码| 美美哒免费高清在线观看视频一区二区| 久久免费视频网| 国产在线一区视频| 影音先锋亚洲精品| 欧美精品激情视频| 精品视频在线观看免费| 午夜天堂精品久久久久| 久久国产精品久久国产精品| 免费观看特级毛片| 久久亚洲影视| 日韩性生活视频| 免费成人美女女在线观看| 日韩久久精品| 精品国产一区av| 91视频综合网| 午夜久久美女| 97热精品视频官网| 女人十八岁毛片| 裸体一区二区| 国产精品你懂得| 一级片一区二区三区| 奇米综合一区二区三区精品视频| 欧美日韩国产成人| 久久这里只有精品免费| 99精品热6080yy久久| 97在线观看视频国产| 久久久久久少妇| 国模吧视频一区| 久久久久久久国产精品视频| 日韩精品成人一区| 久久久精品五月天| 国产拍精品一二三| 精品久久久免费视频| 国产东北露脸精品视频| 精品国产日本| 在线免费黄色| 亚洲一区二区在线视频| 自慰无码一区二区三区| 精品肉辣文txt下载| 欧美电影一区二区三区| 亚洲最大视频网| 亚洲v天堂v手机在线| 中文在线不卡视频| 久久久久久久久99| 丝袜诱惑亚洲看片| 91丨九色丨国产| 精品无人乱码| 亚洲九九爱视频| 精品视频无码一区二区三区| 日韩福利影视| 亚洲国产精品系列| 少妇愉情理伦三级| 亚洲精品黄色| 91精品免费久久久久久久久| 人人妻人人澡人人爽精品日本| 久久理论电影网| www.69av| 51一区二区三区| 亚洲第一综合天堂另类专| 在线国产视频一区| 免费观看性欧美大片无片| 亚洲国产91精品在线观看| 夫妇交换中文字幕| 精品免费视频| 欧美放荡办公室videos4k| 日日摸天天添天天添破| 国产一区激情在线| 欧美另类一区| 丁香花视频在线观看| 在线欧美日韩国产| 亚洲欧美日韩色| 欧美一区久久| 国产美女久久精品香蕉69| 婷婷丁香花五月天| 亚洲久本草在线中文字幕| 国产成人黄色网址| 妖精一区二区三区精品视频| 欧美日韩国产123| 97人妻人人澡人人爽人人精品| 97久久精品人人做人人爽50路| 青青在线免费视频| 久久福利在线| 亚洲天堂久久av| 久久一区二区三区视频| 粉嫩高潮美女一区二区三区 | 九色视频在线播放| 精品久久久久久久久久久| 色哟哟在线观看视频| 91久久夜色精品国产按摩| 国产精品999999| 飘雪影院手机免费高清版在线观看 | 美日韩精品免费| 9999在线视频| 欧美精品一区二区高清在线观看| 久久久久99精品成人片试看| 精品系列免费在线观看| 亚洲精品成人久久久998| 日韩免费电影| 亚洲欧美日韩国产中文| 国产小视频在线免费观看| 成人av电影免费在线播放| 香港三级日本三级a视频| 日韩精品中文字幕一区二区 | 国内外成人在线视频| 亚洲欧洲精品在线| 国产在视频一区二区三区吞精| 亚洲人成人99网站| 中文字幕乱码在线观看| 国产精品三级电影| 国模私拍视频在线观看| 欧美激情偷拍自拍| 1卡2卡3卡精品视频| 午夜影院免费在线| 亚洲第一偷拍网| 日韩中文字幕在线观看视频| 久久噜噜亚洲综合| 色播五月综合网| 91精品国产调教在线观看| 91黄在线观看| av资源在线播放| 亚洲视频欧美视频| 在线观看中文字幕2021| 亚洲精品日韩综合观看成人91| 免费欧美一级片| 亚洲高清在线| 欧美精品欧美精品| 色婷婷成人网| 欧美激情久久久| 色视频精品视频在线观看| 欧美影视一区二区三区| 国产精品白丝喷水在线观看| 懂色中文一区二区在线播放| 日韩欧美亚洲天堂| 日韩精品二区| 国产99视频精品免费视频36| 新版的欧美在线视频| 色系列之999| www.黄色av| 一本色道综合亚洲| 天堂网avav| 2021中文字幕一区亚洲| 中文字幕第一页在线视频| 尹人成人综合网| 亚洲欧洲一区二区福利| 日韩中文字幕| 国产精品极品美女在线观看免费| 国产激情在线视频| 日韩精品免费看| 一级片在线观看视频| 性欧美大战久久久久久久久| 亚洲一区视频在线播放| 国产99久久久精品| 日韩免费高清在线| 极品裸体白嫩激情啪啪国产精品| 青娱乐一区二区| 中文久久电影小说| 国产精品免费一区二区三区都可以| 色呦呦在线免费观看| 一道本无吗dⅴd在线播放一区 | 日韩一级裸体免费视频| av资源免费看| 欧美在线看片a免费观看| 久久久久久久9999| 亚洲欧美在线另类| 91网站免费视频| 成人h精品动漫一区二区三区| 日韩精品视频一区二区在线观看| av一区二区在线观看| 国产精品区一区二区三在线播放| 国产一区二区色噜噜| 欧美性视频网站| 国产乱妇乱子在线播视频播放网站| 主播福利视频一区| 精品一二三区视频| 日韩av一卡二卡| 亚洲精品视频网| 欧美精品aⅴ在线视频| 无码日韩精品一区二区| 性感美女极品91精品| 欧美成人手机视频| 亚洲日本va午夜在线影院| 国产农村妇女精品一区| 久久精品夜夜夜夜久久| yy6080午夜| 成人涩涩免费视频| 色综合久久久无码中文字幕波多| 久久精品国产精品亚洲综合| 国产亚洲天堂网| 国产亚洲欧洲| 1024av视频| 亚洲三级观看| 成 年 人 黄 色 大 片大 全| 一区二区在线| 亚洲自拍偷拍一区二区三区| 91久久电影| 一区二区在线不卡| 国产国产精品| 99亚洲精品视频| 91精品国产91久久久久久黑人| 香蕉精品视频在线| 国产精品精品国产一区二区| 日本一区免费看| 少妇一区二区视频| 日韩欧美在线一区二区| sdde在线播放一区二区| 日韩免费三级| 国产一区三区在线播放| 日本成人黄色免费看| 精品99在线| 亚洲一区二区三区精品视频| 国产韩日影视精品| 男人日女人的bb| 激情文学一区| 丰满爆乳一区二区三区| 久久aⅴ国产紧身牛仔裤| 国产三级日本三级在线播放| 日韩精品国产欧美| 一区二区在线免费看| 国产一区二区三区四| 美女伦理水蜜桃4| 91小视频在线| 婷婷综合在线视频| 亚洲男人电影天堂| 日韩熟女精品一区二区三区| 欧美日韩亚洲天堂| 中文字幕永久在线观看| 欧美一区二区三区影视| 污污的视频网站在线观看| 亚洲精品有码在线| 黄色网址在线免费| 国外色69视频在线观看| 国产精品专区免费| 成人国产在线视频| 卡通动漫国产精品| 视频在线99re| 中文字幕一区二区三区欧美日韩| 婷婷无套内射影院| 青青国产91久久久久久 | 日韩最新av| 免费成人看片网址| 91精品国产91久久久久久密臀| xxxx18hd亚洲hd捆绑| 日本不卡123| 男人添女人荫蒂国产| 久久久久高清精品| 99自拍视频在线| 午夜欧美在线一二页| 中文字幕1区2区3区| 精品成人在线观看| 91成人高清| 欧美一级片免费在线| 中国a一片一级一片| 亚洲精品一级二级| 国产精品欧美日韩一区二区| 免费一区二区三区在线视频| 农村寡妇一区二区三区| 欧美成人久久| 噼里啪啦国语在线观看免费版高清版| 国产伦精一区二区三区| 日韩精品无码一区二区三区久久久| 亚洲免费高清视频在线| 久久国产黄色片| 欧美一区二区成人6969| 国产女主播在线写真| 欧美激情网友自拍| 亚洲青青久久| 欧美极品一区二区| 亚洲久久在线| 日韩精品――色哟哟| 欧美极品xxx| 欧美激情黑白配| 精品国产91九色蝌蚪| 成人在线直播| 国产精品美女www| 一道本一区二区三区| 国产精品视频网站在线观看| 九九在线精品视频| 亚洲黄色小说视频| 欧美日韩国产一区中文午夜| www.欧美国产| 久久大大胆人体| 色8久久久久| 亚洲人成网站在线播放2019| 午夜影院日韩| 欧美做受喷浆在线观看| 亚洲午夜激情网站| 99久久精品国产成人一区二区| 一区二区在线视频播放| 综合在线影院| 欧美一区二区在线视频观看| 亚洲黄色影院| 亚洲中文字幕无码av| 亚洲国产精品一区二区久久| 亚洲av无码一区二区乱子伦| 另类专区欧美制服同性| 午夜精品久久久久久毛片| 一区视频二区视频| 久久成人免费网| 成人一级黄色大片| 538在线一区二区精品国产| 麻豆tv在线| 97自拍视频| 99riav1国产精品视频| 国产又粗又长又爽| 黑人巨大精品欧美一区免费视频| 五月天婷婷激情网| 国产aaa精品| 成人午夜国产| 国产女同无遮挡互慰高潮91| 亚洲欧美在线高清| 国产熟女一区二区丰满| 欧美高清视频免费观看| 51亚洲精品| 男女av免费观看| 国产嫩草影院久久久久| 国产精品国产三级国产aⅴ | 一级特黄曰皮片视频| 欧美日韩综合色| 超碰个人在线| 日韩欧美国产麻豆| 久久久久免费看| 亚洲精品一区在线观看| 理论不卡电影大全神| 欧美日韩精品久久久免费观看| 日韩成人免费电影| 久久福利免费视频| 亚洲国产精品一区二区三区| 在线看的毛片| 亚洲午夜久久久影院伊人| 国产一区二区三区免费在线观看 | 亚洲国产精品综合久久久| 日本xxxx免费| 一本色道久久综合精品竹菊| 69久久久久| 2019国产精品视频| 亚洲欧美视频| 国产一区二区三区在线视频观看| 亚洲国产另类久久精品| 91成人在线| 日本aa在线观看| 国产调教视频一区| 国产视频一区二区三区四区五区 | 日本精品在线一区| 亚洲啊啊啊啊啊| 久久久欧美精品sm网站| 国产免费久久久| 日韩女优人人人人射在线视频| 97精品视频| 国产男女猛烈无遮挡a片漫画 | www.成人黄色| 精品久久久中文| 九色porny在线| 欧美一级爽aaaaa大片| 国产一区二区免费看| 一级片在线观看免费| 欧美激情极品视频| 久久精品av|