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面試專題解析與拓展!