<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot 異常處理,值得學(xué)習(xí)!

          共 2813字,需瀏覽 6分鐘

           ·

          2022-04-11 13:34

          點(diǎn)擊關(guān)注公眾號,Java干貨及時(shí)送達(dá)

          作者:xbhog
          鏈接:www.cnblogs.com/xbhog/p/15207278.html

          異常處理:

          背景:

          最近在搭建屬于自己的個(gè)人博客(碼農(nóng)小白的執(zhí)念),自己搭建后端的時(shí)候首先考慮的是異常處理。

          個(gè)人也是一邊學(xué)習(xí)一邊做,難免有疏漏的地方,希望朋友們在不對的地方提醒下。

          技術(shù)棧:

          1. springBoot 2.5.3
          2. Mybatis-plus
          3. thymeleaf
          4. mysql

          該博客簡單記錄一下自己的學(xué)習(xí)過程,如果后面作出簡單的demo來,那么會整理其中的細(xì)節(jié)發(fā)布出來。

          推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:

          https://github.com/javastacks/spring-boot-best-practice

          異常處理

          個(gè)人粗糙的學(xué)習(xí)和理解,我把異常錯(cuò)誤分為三個(gè),4xx,5xx,error(自定義)

          常用的是404和500響應(yīng)

          • 404 (未找到) 服務(wù)器找不到請求的網(wǎng)頁
          • 服務(wù)器內(nèi)部錯(cuò)誤 服務(wù)器遇到錯(cuò)誤,無法完成請求

          在templates文件下創(chuàng)建404.html、500.html和error.html

          如果創(chuàng)建的是4xx.html和5xx.html,那么當(dāng)頁面找不到或者程序內(nèi)部錯(cuò)誤的話,SpringBoot自動匹配到這兩個(gè)頁面,具體的源碼在這里就不分析,感興趣的可以去學(xué)習(xí)下。

          當(dāng)我想將錯(cuò)誤信息返回到我自定義的頁面怎么寫?

          我們自頂向下來思考:

          1. 我們訪問頁面的時(shí)候,頁面發(fā)生錯(cuò)誤也好,找不到也好,是不是都要走它請求的Url,那我們怎么處理這個(gè)請求呢?
          2. 這時(shí)候我們自然而然的想到攔截器,所以編寫ControllerExceptionHandler類,來專門攔截所有的異常請求。
          3. 當(dāng)我們處理完異常后,把這個(gè)流放行,或者返回我們需要的自定義頁面上。

          這樣就實(shí)現(xiàn)了我們上述的需求。

          所需要的技術(shù)點(diǎn):

          1. @ControllerAdvice
            • 配合 @ExceptionHandler注解結(jié)合使用,當(dāng)異常拋到controller層時(shí),可以對異常進(jìn)行統(tǒng)一的處理,規(guī)定返回的json格式或者跳轉(zhuǎn)到指定的錯(cuò)誤頁面等.
          2. @ExceptionHandler(Exception.class) // 表示 捕獲 全部異常
          3. ModelAndView 其實(shí)就是兩個(gè)作用,一個(gè)是指定返回頁面,另一個(gè)是在返回頁面的同時(shí)添加屬性

          通過Logger來打印獲取相關(guān)的異常信息:

          //獲取異常的信息
          logger.error(()?->?{
          ????return?String.format("Request?URL?:?%s,Exception?:?%s?",?request.getRequestURL(),e);
          },e);

          在這里自己走了一些彎路,小伙子自己走窄了,導(dǎo)包倒錯(cuò)了??。最新面試題整理好了,大家可以在Java面試庫小程序在線刷題。

          這里我導(dǎo)的包是mybatis中的:

          import?org.mybatis.logging.Logger;
          import?org.mybatis.logging.LoggerFactory;

          傳參一直不對,只能走源碼的路子了,看看自己調(diào)用的什么玩意:最后就寫成了上述的代碼格式。

          我看其他人寫的代碼的時(shí)候才恍然大明白,如下:

          import?org.slf4j.Logger;
          import?org.slf4j.LoggerFactory;

          logger.error("Requst?URL?:?{},Exception?:?{}",?request.getRequestURL(),e);

          可能有的朋友感覺沒啥,但是我自己調(diào)了半個(gè)小時(shí)才出來,菜是原罪。

          Logger這個(gè)只是在控制臺輸出,或者綁定了日志,會輸出到日志中。

          點(diǎn)擊關(guān)注公眾號,Java干貨及時(shí)送達(dá)

          接著上述問題通過ModelAndView類實(shí)現(xiàn):

          ModelAndView像極了Model。

          ModelAndView?modelAndView?=?new?ModelAndView();??//實(shí)例化一個(gè)ModelAndView
          modelAndView.addObject("url",request.getRequestURL());??//獲取的url添加到model中
          modelAndView.addObject("exception",e);??//獲取的異常信息
          //返回給error頁面
          modelAndView.setViewName("error/error");
          return?modelAndView;

          敲黑板:來新需求了!

          如果我想從所有的異常中剝離出404異常并返回給SpringBoot讓他自動處理頁面怎么解。最新 Spring Boot 面試題整理好了,大家可以在Java面試庫小程序在線刷題。

          照學(xué)習(xí)的來說。當(dāng)頁面為null的時(shí)候,向上拋出一個(gè)自定義的異常類,該異常類標(biāo)注了異常狀態(tài)。

          throw?new?NotFoundException("博客找不到,請聯(lián)系管理員");?//自定義類
          @ResponseStatus(HttpStatus.NOT_FOUND)
          public?class?NotFoundException?extends?RuntimeException{
          ????public?NotFoundException()?{
          ????????super();
          ????}
          ????public?NotFoundException(String?message)?{
          ????????super(message);
          ????}
          }

          然后我們可以在總的異常中通AnnotationUtils.findAnnotation通過傳入AnnotatedElement注解類型來查找方法或者類對象上的注解。

          如果滿足條件可以拋出異常讓SpringBoot接管。

          if?(AnnotationUtils.findAnnotation(e.getClass(),?ResponseStatus.class)?!=?null)?{
          ????throw?e;
          }

          結(jié)束:

          如果你看到這里或者正好對你有所幫助,希望能點(diǎn)個(gè)關(guān)注或者推薦,感謝!








          瘋了!Spring 再官宣驚天大漏洞。。
          2021 年發(fā)生的 10 件技術(shù)大事!!
          23 種設(shè)計(jì)模式實(shí)戰(zhàn)(很全)
          Spring Boot 保護(hù)敏感配置的 4 種方法!
          再見單身狗!Java 創(chuàng)建對象的 6 種方式
          阿里為什么推薦使用 LongAdder?
          AnotherRedisDesktopManager 開始收費(fèi)了?
          別再寫爆爆爆炸類了,試試裝飾器模式!
          Java 18 發(fā)布,默認(rèn) UTF-8,finalize 被棄用。
          Spring Boot 3.0 M1 發(fā)布,正式棄用 Java 8
          Spring Boot 學(xué)習(xí)筆記,這個(gè)太全了!



          關(guān)注Java技術(shù)棧看更多干貨



          獲取 Spring Boot 實(shí)戰(zhàn)筆記!
          瀏覽 25
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天操天天插 | 日本黄色成人网址 | 男人天堂最新网址 | 欧美性爱内射大奶美女 | 亚洲午夜免费视频 |