1. 程式人生 > 其它 >SpringBoot---錯誤處理機制,nginx架構分析

SpringBoot---錯誤處理機制,nginx架構分析

[](

)原理-----SpirngMVC錯誤處理的自動配置

可以參照ErrorMvcAutoConfiguration;錯誤處理的自動配置;

給容器中添加了以下元件:

1、DefaultErrorAttributes:

2、BasicErrorController:處理預設/error請求

3、ErrorPageCustomizer:錯誤頁面定製

4、DefaultErrorViewResolver:

步驟:

一但系統出現4xx或者5xx之類的錯誤;ErrorPageCustomizer就會生效(定製錯誤的響應規則);就會來到/error

請求: 就會被BasicErrorController處理;

響應頁面: 去哪個頁面是由DefaultErrorViewResolver解析得到的;


[](

)如何定製錯誤響應


[](

)1.定製錯誤響應頁面


[](

)1.如何定製錯誤的json資料

自定義異常:


public class UserNotFoundException extends RuntimeException

{

    public UserNotFoundException()

    {

        super("使用者不存在");//錯誤顯示

    }

} 

如何定製錯誤的JSON資料


@ControllerAdvice//處理全域性異常的類

public class exception

{

//瀏覽器客戶端返回的都是JSON資料

    @ResponseBody

    @ExceptionHandler(Exception.class)

    public Map<String,Object> handleException(Exception e){

        Map<String,Object> map = new HashMap<>();

        map.put("code","user.notexist");

        map.put("message",e.getMessage());

        return map;

    }

} 

上面的寫法沒有自適應效果,即瀏覽器訪問返回一個錯誤頁面,其他客戶端訪問,返回一個JSON資料


[](

)出現自適應效果:轉發到error請求,讓BasicErrorController來處理該請求

這裡沒有設定錯誤狀態碼,轉發成功後,狀態碼為200,因此無法走到定製錯誤頁面解析流程


@ControllerAdvice//處理全域性異常的類

public class exception

{

    @ExceptionHandler(UserNotFoundException.class)

    public String handleException(Exception e){

        Map<String,Object> map = new HashMap<>();

        map.put("code","user.notexist");

        map.put("message",e.getMessage());

        //轉發到error請求

        //BasicErrorController:處理預設/error請求

        return "forward:/error";

    }

} 


[](

)傳入我們自己的錯誤狀態碼 4xx 5xx,否則就不會進入定製錯誤頁面的解析流程


@ControllerAdvice//處理全域性異常的類

public class exception

{

    @ExceptionHandler(UserNotFoundException.class)

    public String handleException(Exception e, HttpServletRequest request){

        Map<String,Object> map = new HashMap<>();

        //傳入我們自己的錯誤狀態碼  4xx 5xx,否則就不會進入定製錯誤頁面的解析流程

        /**

         * Integer statusCode = (Integer) request

         .getAttribute("javax.servlet.error.status_code");

         */

        request.setAttribute("javax.servlet.error.status_code",400);

        map.put("code","user.notexist");

        map.put("message",e.getMessage());

        //轉發到error請求

        //BasicErrorController:處理預設/error請求

        return "forward:/error";

    }

} 


[](

)將我們定製資料攜帶出去

[](

)出現錯誤以後,會來到/error請求,會被BasicErrorController處理,響應出去可以獲取的資料是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)規定的方法)

? 1、完全來編寫一個ErrorController的實現類【或者是編寫AbstractErrorController的子類】,放在容器中;

? 2、頁面上能用的資料,或者是json返回能用的資料都是通過errorAttributes.getErrorAttributes得到;

[](

)? 容器中DefaultErrorAttributes.getErrorAttributes();預設進行資料處理的;

自定義ErrorAttributes(錯誤屬性)

這裡springboot都是去容器中檢視使用者是否存在上面的錯誤相關的類,如果沒有才會使用預設的配置類,因此我們可以通過重寫上面的錯誤類,放入容器中,完成定製錯誤資料並攜帶出去

最後

CodeChina開源專案:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊】

ActiveMQ訊息中介軟體面試專題

  • 什麼是ActiveMQ?
  • ActiveMQ伺服器宕機怎麼辦?
  • 丟訊息怎麼辦?
  • 持久化訊息非常慢怎麼辦?
  • 訊息的不均勻消費怎麼辦?
  • 死信佇列怎麼辦?
  • ActiveMQ中的訊息重發時間間隔和重發次數嗎?

ActiveMQ訊息中介軟體面試專題解析拓展:


redis面試專題及答案

  • 支援一致性雜湊的客戶端有哪些?
  • Redis與其他key-value儲存有什麼不同?
  • Redis的記憶體佔用情況怎麼樣?
  • 都有哪些辦法可以降低Redis的記憶體使用情況呢?
  • 檢視Redis使用情況及狀態資訊用什麼命令?
  • Redis的記憶體用完了會發生什麼?
  • Redis是單執行緒的,如何提高多核CPU的利用率?

Spring面試專題及答案

  • 談談你對 Spring 的理解
  • Spring 有哪些優點?
  • Spring 中的設計模式
  • 怎樣開啟註解裝配以及常用註解
  • 簡單介紹下 Spring bean 的生命週期

Spring面試答案解析拓展


高併發多執行緒面試專題

  • 現在有執行緒 T1、T2 和 T3。你如何確保 T2 執行緒在 T1 之後執行,並且 T3 執行緒在 T2 之後執行?
  • Java 中新的 Lock 介面相對於同步程式碼塊(synchronized block)有什麼優勢?如果讓你實現一個高效能快取,支援併發讀取和單一寫入,你如何保證資料完整性。
  • Java 中 wait 和 sleep 方法有什麼區別?
  • 如何在 Java 中實現一個阻塞佇列?
  • 如何在 Java 中編寫程式碼解決生產者消費者問題?
  • 寫一段死鎖程式碼。你在 Java 中如何解決死鎖?

高併發多執行緒面試解析與拓展


jvm面試專題與解析

  • JVM 由哪些部分組成?
  • JVM 記憶體劃分?
  • Java 的記憶體模型?
  • 引用的分類?
  • GC什麼時候開始?

JVM面試專題解析與拓展!