最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot異常錯誤處理解決方案詳解

 更新時間:2020年08月31日 12:00:49   作者:白熊啊  
這篇文章主要介紹了Springboot異常錯誤處理解決方案詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1.在有模板引擎的情況下:

springboot會默認找 templates/error/錯誤狀態(tài)碼.html,所以我們要定制化錯誤頁面就可以到templates/error下創(chuàng)建一個【對應錯誤狀態(tài)碼.html】html文件,當發(fā)生此狀態(tài)碼的錯誤springboot就會來到對應的頁面。

同時如果我們想讓400-499之間的錯誤都去同一個錯誤頁面,那我們可以在templates/error下創(chuàng)建一個4xx.html。同理500-599的錯誤可以用5xx.html。

注意:springboot會優(yōu)先匹配具體的【錯誤狀態(tài)碼.html】,然后再匹配4xx,5xx的。例如:發(fā)生了404錯誤,springboot優(yōu)先到templates/error下找404.html,如果沒有404.html,再找有沒有4xx.html,有的話就會使用4xx.html。

在錯誤頁面我們能夠獲取到的信息:

  • timestamp:時間戳
  • status:狀態(tài)碼
  • error:錯誤提示
  • exception:異常對象 springboot2.1.6在頁面獲取異常對象要現(xiàn)在全局配置文件中加入:server.error.include-exception=true
  • message:異常消息
  • errors:JSR數(shù)據(jù)校驗的錯誤

2.在沒有模板引擎(模板引擎找不到這個錯誤頁面)的情況下,springboot會到靜態(tài)資源文件夾下的error包下找。

3.以上都沒有找到錯誤頁面,就默認用springboot默認的錯誤提示頁面

錯誤異常處理——自定義響應json數(shù)據(jù)

上邊的錯誤處理中,如果是瀏覽器訪問可以響應我們自己定制的錯誤頁面,但是如果是其他客戶端訪問,則只會響應固定的json數(shù)據(jù),如下圖所示:

下邊講解三個異常處理返回自定義json數(shù)據(jù)的方式

首先編寫一個自定義異常類

public class UserNotExitException extends RuntimeException {
  public UserNotExitException() {
    super("用戶不存在");
  }
}

方式一:

在異常處理器類中,通過map封裝我們自己的json數(shù)據(jù),然后將map返回。

@ControllerAdvice
public class MyExceptionHandler {

  @ResponseBody
  @ExceptionHandler(UserNotExitException.class)
  public Map<String,Object> userNotExitExceptionHandler(Exception e){
    Map<String,Object> map = new HashMap<>();
    map.put("code","user.notexit");
    map.put("message",e.getMessage());
    return map;
  }
}

  @ControllerAdvice:表明這是一個全局異常處理類

  @ExceptionHandler(UserNotExitException.class):表明標注的此方法用于處理UserNotExitException異常。

  @ResponseBody:將返回結(jié)果封裝為json

3.結(jié)果

  不管瀏覽器還是其他客戶端發(fā)生該異常都統(tǒng)一得到下圖的響應

      

方式二:轉(zhuǎn)發(fā)到/error,進行自適應響應效果處理

@ControllerAdvice
public class MyExceptionHandler {
  @ExceptionHandler(UserNotExitException.class)
  public String userNotExitExceptionHandler(Exception e, HttpServletRequest request){
    Map<String,Object> map = new HashMap<>();
    request.setAttribute("javax.servlet.error.status_code",500);
    map.put("code","user.notexit");
    map.put("message","用戶出錯了");
    return "forward:/error";
  }
}

將響應轉(zhuǎn)發(fā)到 /error,讓springboot幫我們生成自適應效果。但是必須注意,一定要設置錯誤狀態(tài)碼(如代碼中標黃色的那一句代碼)。不設置的話springboot就不會進入定制錯誤頁面的解析流程。設置了之后springboot就會到templates/error/錯誤狀態(tài)碼.html頁面處理。

注意:此方式瀏覽器訪問發(fā)生錯誤不再響應的是json數(shù)據(jù)了,而是對于的錯誤響應網(wǎng)頁。

其他客戶端訪問響應的是json數(shù)據(jù),但是響應的json數(shù)據(jù)中沒有我們map中put的數(shù)據(jù)。

方式三:通過DefaultErrorAttribute

1.在異常處理器類中將響應的json數(shù)據(jù)封裝到map中,然后再將map放到請求域中

@ControllerAdvice
public class MyExceptionHandler {
  @ExceptionHandler(UserNotExitException.class)
  public String userNotExitExceptionHandler(Exception e, HttpServletRequest request){
    Map<String,Object> map = new HashMap<>();
    request.setAttribute("javax.servlet.error.status_code",500);
    map.put("code","user.notexit");
    map.put("message","用戶出錯了");
    request.setAttribute("ext",map);
    return "forward:/error";
  }
}

2.編寫錯誤屬性類:新建一個類繼承DefaultErrorAttribute類,并重寫其中的getErrorAttributes方法

@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
  @Override
  public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
    Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
    map.put("company","atguigu");
    Map<String, Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", 0);
    map.put("ext",ext);
    return map;
  }
}

注意:

(1).必須將錯誤屬性類添加到spring容器中。

(2).第7行標黃那段代碼的作用是獲取異常處理類中的map。其中最后的參數(shù)0,是從request域中取出數(shù)據(jù)“ext”。若要從session域中取數(shù)據(jù),則將該參數(shù)設置為1.(0是從request域獲取數(shù)據(jù),1是從session域中獲取數(shù)據(jù))

(3).錯誤屬性類中返回的map中的所有內(nèi)容,頁面都可以獲取到。

總結(jié):

  此方式最好,當瀏覽器訪問發(fā)生錯誤時,會響應對應的錯誤響應頁面,當其他客戶端訪問發(fā)生錯誤時也會響應我們定制的json數(shù)據(jù)。

瀏覽器響應:

其他客戶端響應:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 面試初級Java開發(fā)問到Arrays

    面試初級Java開發(fā)問到Arrays

    這篇文章主要介紹了Java Arrays工具類用法,結(jié)合實例形式分析了java Arrays工具類針對數(shù)組元素修改、復制、排序等操作使用技巧與相關注意事項,需要的朋友可以參考下
    2021-07-07
  • java網(wǎng)絡編程中向指定URL發(fā)送GET POST請求示例

    java網(wǎng)絡編程中向指定URL發(fā)送GET POST請求示例

    這篇文章主要介紹了java向指定URL發(fā)送GET POST請求示例,學習JAVA網(wǎng)絡編程一定會用到的,大家參考使用吧
    2013-11-11
  • Java中LinkedList原理代碼解析

    Java中LinkedList原理代碼解析

    這篇文章主要介紹了Java中LinkedList原理代碼解析,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • spring-boot 如何實現(xiàn)單次執(zhí)行程序

    spring-boot 如何實現(xiàn)單次執(zhí)行程序

    這篇文章主要介紹了spring-boot 實現(xiàn)單次執(zhí)行程序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 批量將現(xiàn)有Jar包上傳到Maven私服

    批量將現(xiàn)有Jar包上傳到Maven私服

    今天小編就為大家分享一篇關于批量將現(xiàn)有Jar包上傳到Maven私服,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 使用Java實現(xiàn)簡單搭建內(nèi)網(wǎng)穿透

    使用Java實現(xiàn)簡單搭建內(nèi)網(wǎng)穿透

    內(nèi)網(wǎng)穿透是一種網(wǎng)絡技術,適用于需要遠程訪問本地部署服務的場景,本文主要為大家介紹了如何使用Java實現(xiàn)簡單搭建內(nèi)網(wǎng)穿透,感興趣的可以了解下
    2024-02-02
  • 淺談ArrayList和LinkedList到底誰更快

    淺談ArrayList和LinkedList到底誰更快

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著ArrayList和LinkedList到底誰更快展開,文中有非常詳細的介紹,需要的朋友可以參考下
    2021-06-06
  • Java基礎之線程鎖相關知識總結(jié)

    Java基礎之線程鎖相關知識總結(jié)

    今天給大家?guī)淼氖顷P于Java線程的相關知識,文章圍繞著Java線程鎖展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類示例詳解

    Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類示例詳解

    這篇文章主要介紹了Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • java可變參數(shù)(不定向參數(shù))的作用與實例

    java可變參數(shù)(不定向參數(shù))的作用與實例

    這篇文章主要給大家介紹了關于java可變參數(shù)(不定向參數(shù))的作用與實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04

最新評論

绩溪县| 筠连县| 旺苍县| 米易县| 城口县| 恩平市| 永嘉县| 三江| 昭通市| 曲靖市| 洪洞县| 太谷县| 江永县| 浮梁县| 乌拉特后旗| 沽源县| 安国市| 石棉县| 陇南市| 益阳市| 德阳市| 南涧| 巴林右旗| 射洪县| 柳江县| 永年县| 怀远县| 长岛县| 建湖县| 油尖旺区| 社旗县| 绥滨县| 南投县| 汕尾市| 鹤山市| 浦江县| 工布江达县| 宝丰县| 温宿县| 汤阴县| 扎囊县|