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

淺談SpringBoot 中關于自定義異常處理的套路

 更新時間:2019年04月17日 09:48:14   作者:江南一點雨  
這篇文章主要介紹了淺談SpringBoot 中關于自定義異常處理的套路,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在 Spring Boot 項目中 ,異常統(tǒng)一處理,可以使用 Spring 中 @ControllerAdvice 來統(tǒng)一處理,也可以自己來定義異常處理方案。Spring Boot 中,對異常的處理有一些默認的策略,我們分別來看。

默認情況下,Spring Boot 中的異常頁面 是這樣的:

 

我們從這個異常提示中,也能看出來,之所以用戶看到這個頁面,是因為開發(fā)者沒有明確提供一個 /error 路徑,如果開發(fā)者提供了 /error 路徑 ,這個頁面就不會展示出來,不過在 Spring Boot 中,提供 /error 路徑實際上是下下策,Spring Boot 本身在處理異常時,也是當所有條件都不滿足時,才會去找 /error 路徑。那么我們就先來看看,在 Spring Boot 中,如何自定義 error 頁面,整體上來說,可以分為兩種,一種是靜態(tài)頁面,另一種是動態(tài)頁面。

靜態(tài)異常頁面

自定義靜態(tài)異常頁面,又分為兩種,第一種 是使用 HTTP 響應碼來命名頁面,例如 404.html、405.html、500.html ....,另一種就是直接定義一個 4xx.html,表示400-499 的狀態(tài)都顯示這個異常頁面,5xx.html 表示 500-599 的狀態(tài)顯示這個異常頁面。

默認是在 classpath:/static/error/ 路徑下定義相關頁面:

此時,啟動項目,如果項目拋出 500 請求錯誤,就會自動展示 500.html 這個頁面,發(fā)生 404 就會展示 404.html 頁面。如果異常展示頁面既存在 5xx.html,也存在 500.html ,此時,發(fā)生500異常時,優(yōu)先展示 500.html 頁面。

動態(tài)異常頁面

動態(tài)的異常頁面定義方式和靜態(tài)的基本 一致,可以采用的頁面模板有 jsp、freemarker、thymeleaf。動態(tài)異常頁面,也支持 404.html 或者 4xx.html ,但是一般來說,由于動態(tài)異常頁面可以直接展示異常詳細信息,所以就沒有必要挨個枚舉錯誤了 ,直接定義 4xx.html(這里使用thymeleaf模板)或者 5xx.html 即可。

注意,動態(tài)頁面模板,不需要開發(fā)者自己去定義控制器,直接定義異常頁面即可 ,Spring Boot 中自帶的異常處理器會自動查找到異常頁面。

頁面定義如下:

頁面內(nèi)容如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<h1>5xx</h1>
<table border="1">
  <tr>
    <td>path</td>
    <td th:text="${path}"></td>
  </tr>
  <tr>
    <td>error</td>
    <td th:text="${error}"></td>
  </tr>
  <tr>
    <td>message</td>
    <td th:text="${message}"></td>
  </tr>
  <tr>
    <td>timestamp</td>
    <td th:text="${timestamp}"></td>
  </tr>
  <tr>
    <td>status</td>
    <td th:text="${status}"></td>
  </tr>
</table>
</body>
</html>

默認情況下,完整的異常信息就是這5條,展示 效果如下 :

如果動態(tài)頁面和靜態(tài)頁面同時定義了異常處理頁面,例如 classpath:/static/error/404.htmlclasspath:/templates/error/404.html 同時存在時,默認使用動態(tài)頁面。即完整的錯誤頁面查找方式應該是這樣:

發(fā)生了500錯誤-->查找動態(tài) 500.html 頁面-->查找靜態(tài) 500.html --> 查找動態(tài) 5xx.html-->查找靜態(tài) 5xx.html。

自定義異常數(shù)據(jù)

默認情況下,在Spring Boot 中,所有的異常數(shù)據(jù)其實就是上文所展示出來的5條數(shù)據(jù),這5條數(shù)據(jù)定義在 org.springframework.boot.web.reactive.error.DefaultErrorAttributes 類中,具體定義在 getErrorAttributes 方法中 :

@Override
public Map<String, Object> getErrorAttributes(ServerRequest request,
        boolean includeStackTrace) {
    Map<String, Object> errorAttributes = new LinkedHashMap<>();
    errorAttributes.put("timestamp", new Date());
    errorAttributes.put("path", request.path());
    Throwable error = getError(request);
    HttpStatus errorStatus = determineHttpStatus(error);
    errorAttributes.put("status", errorStatus.value());
    errorAttributes.put("error", errorStatus.getReasonPhrase());
    errorAttributes.put("message", determineMessage(error));
    handleException(errorAttributes, determineException(error), includeStackTrace);
    return errorAttributes;
}

DefaultErrorAttributes 類本身則是在org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration 異常自動配置類中定義的,如果開發(fā)者沒有自己提供一個 ErrorAttributes 的實例的話,那么 Spring Boot 將自動提供一個ErrorAttributes 的實例,也就是 DefaultErrorAttributes 。

基于此 ,開發(fā)者自定義 ErrorAttributes 有兩種方式 :

  1. 直接實現(xiàn) ErrorAttributes 接口
  2. 繼承 DefaultErrorAttributes(推薦),因為 DefaultErrorAttributes 中對異常數(shù)據(jù)的處理已經(jīng)完成,開發(fā)者可以直接使用。

具體定義如下:

@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
  @Override
  public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
    Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
    if ((Integer)map.get("status") == 500) {
      map.put("message", "服務器內(nèi)部錯誤!");
    }
    return map;
  }
}

定義好的 ErrorAttributes 一定要注冊成一個 Bean ,這樣,Spring Boot 就不會使用默認的 DefaultErrorAttributes 了,運行效果如下圖:

自定義異常視圖

異常視圖默認就是前面所說的靜態(tài)或者動態(tài)頁面,這個也是可以自定義的,首先 ,默認的異常視圖加載邏輯在 org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController 類的 errorHtml 方法中,這個方法用來返回異常頁面+數(shù)據(jù),還有另外一個 error 方法,這個方法用來返回異常數(shù)據(jù)(如果是 ajax 請求,則該方法會被觸發(fā))。

@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request,
        HttpServletResponse response) {
    HttpStatus status = getStatus(request);
    Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
            request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
    response.setStatus(status.value());
    ModelAndView modelAndView = resolveErrorView(request, response, status, model);
    return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}

在該方法中 ,首先會通過 getErrorAttributes 方法去獲取異常數(shù)據(jù)(實際上會調(diào)用到 ErrorAttributes 的實例 的 getErrorAttributes 方法),然后調(diào)用 resolveErrorView 去創(chuàng)建一個 ModelAndView ,如果這里創(chuàng)建失敗,那么用戶將會看到默認的錯誤提示頁面。

正常情況下, resolveErrorView 方法會來到 DefaultErrorViewResolver 類的 resolveErrorView 方法中:

@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,
        Map<String, Object> model) {
    ModelAndView modelAndView = resolve(String.valueOf(status.value()), model);
    if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
        modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
    }
    return modelAndView;
}

在這里,首先以異常響應碼作為視圖名分別去查找動態(tài)頁面和靜態(tài)頁面,如果沒有查找到,則再以 4xx 或者 5xx 作為視圖名再去分別查找動態(tài)或者靜態(tài)頁面。

要自定義異常視圖解析,也很容易 ,由于 DefaultErrorViewResolver 是在 ErrorMvcAutoConfiguration 類中提供的實例,即開發(fā)者沒有提供相關實例時,會使用默認的 DefaultErrorViewResolver ,開發(fā)者提供了自己的 ErrorViewResolver 實例后,默認的配置就會失效,因此,自定義異常視圖,只需要提供 一個 ErrorViewResolver 的實例即可:

@Component
public class MyErrorViewResolver extends DefaultErrorViewResolver {
  public MyErrorViewResolver(ApplicationContext applicationContext, ResourceProperties resourceProperties) {
    super(applicationContext, resourceProperties);
  }
  @Override
  public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
    return new ModelAndView("/aaa/123", model);
  }
}

實際上,開發(fā)者也可以在這里定義異常數(shù)據(jù)(直接在 resolveErrorView 方法重新定義一個 model ,將參數(shù)中的model 數(shù)據(jù)拷貝過去并修改,注意參數(shù)中的 model 類型為 UnmodifiableMap,即不可以直接修改),而不需要自定義MyErrorAttributes。定義完成后,提供一個名為123的視圖,如下圖:

如此之后,錯誤試圖就算定義成功了。

總結(jié)

實際上也可以自定義異??刂破?BasicErrorController ,不過松哥覺得這樣太大動干戈了,沒必要,前面幾種方式已經(jīng)可以滿足我們的大部分開發(fā)需求了。

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

相關文章

  • Java集合之HashMap/hashTable詳解

    Java集合之HashMap/hashTable詳解

    這篇文章主要介紹了Java集合之HashMap/hashTable詳解,Map是映射鍵值的對象,map不能包含重復鍵:每個鍵最多只能映射一個值,它模擬了數(shù)學函數(shù)的抽象,需要的朋友可以參考下
    2023-09-09
  • Spring Boot+Nginx實現(xiàn)大文件下載功能

    Spring Boot+Nginx實現(xiàn)大文件下載功能

    相信很多小伙伴,在日常開放中都會遇到大文件下載的情況,大文件下載方式也有很多,比如非常流行的分片下載、斷點下載;當然也可以結(jié)合Nginx來實現(xiàn)大文件下載,在中小項目非常適合使用,這篇文章主要介紹了Spring Boot結(jié)合Nginx實現(xiàn)大文件下載,需要的朋友可以參考下
    2024-05-05
  • Java 十大排序算法之歸并排序刨析

    Java 十大排序算法之歸并排序刨析

    歸并排序是采用分治法的一個非常典型的應用。先使每個子序列有序,再使子序列段間有序,也就是將已有的子序列合并,得到完全有序的序列;如果將兩個有序表合并成一個有序表,稱為二路歸并
    2021-11-11
  • springboot項目不同環(huán)境的配置讀取方式

    springboot項目不同環(huán)境的配置讀取方式

    SpringBoot支持application.properties、application.yml、application.yaml三種配置文件類型,可同時存在并合并配置,配置文件的讀取優(yōu)先級為:application.properties > application.yml > application.yaml,不同位置的相同類型配置文件
    2024-11-11
  • java如何使用ftp下載遠程服務器文件

    java如何使用ftp下載遠程服務器文件

    Java通過FTP下載文件主要有兩種方式:第一種是直接在連接中包含賬號和密碼進行遠程下載;第二種是登錄后使用賬號和密碼進行下載,這些方法適用于需要從遠程服務器獲取文件的場景
    2024-11-11
  • java觀察者模式的三種實現(xiàn)方式代碼實例

    java觀察者模式的三種實現(xiàn)方式代碼實例

    這篇文章主要介紹了java觀察者模式的三種實現(xiàn)方式代碼實例,觀察者模式(又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監(jiān)聽某一個主題對象,需要的朋友可以參考下
    2023-10-10
  • 使用Idea或Datagrip導入excel數(shù)據(jù)的方法

    使用Idea或Datagrip導入excel數(shù)據(jù)的方法

    這篇文章主要介紹了使用Idea或Datagrip導入excel數(shù)據(jù)的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 里氏代換原則_動力節(jié)點Java學院整理

    里氏代換原則_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了里氏代換原則的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 解析SpringBoot自定義參數(shù)校驗注解

    解析SpringBoot自定義參數(shù)校驗注解

    這篇文章主要介紹了SpringBoot自定義參數(shù)校驗注解,引入依賴,spring validation是在hibernate-validator上做了一層封裝,文中提到了定義參數(shù)校驗注解與處理器的示例代碼,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • elasticsearch集群cluster?discovery可配式模塊示例分析

    elasticsearch集群cluster?discovery可配式模塊示例分析

    這篇文章主要為大家介紹了elasticsearch集群cluster?discovery可配式模塊示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04

最新評論

左贡县| 延安市| 永清县| 怀来县| 巩义市| 旬阳县| 西畴县| 黑河市| 莆田市| 韩城市| 永吉县| 古丈县| 正安县| 永登县| 张家川| 南宫市| 庆安县| 永新县| 长海县| 扎赉特旗| 荆州市| 无极县| 太原市| 延吉市| 阿克陶县| 沙雅县| 石台县| 泰兴市| 仪陇县| 东平县| 黔西| 内黄县| 札达县| 西贡区| 方山县| 鹤峰县| 马关县| 罗平县| 滦平县| 彩票| 德令哈市|