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

SpringBoot Web開發(fā)中的異常處理自動配置原理解析

 更新時間:2025年10月27日 10:48:27   作者:zl979899  
本文給大家介紹SpringBoot Web開發(fā)中的異常處理自動配置原理解析,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

默認規(guī)則

1. 默認情況下,SpringBoot提供/error處理所有錯誤的映射

2. 對于機器客戶端,它將生成JSON響應,其中包含錯誤,HTTP狀態(tài)和異常消息的詳細信息

  • 例如postman發(fā)送請求

3. 對于瀏覽器客戶端,響應一個“whitelabel”錯誤視圖,以HTML格式呈現(xiàn)相同的數(shù)據(jù)

4. 自定義錯誤視圖解析規(guī)則

  • 完全替換默認行為,可以實現(xiàn) ErrorController 并注冊該類型的Bean定義,或添加ErrorAttributes類型的組件

定制錯誤處理邏輯

1. 自定義錯誤頁

  • 替換默認的“whitelabel”錯誤視圖,在templates在創(chuàng)建error文件夾,定義404和5xx的視圖error/404.html error/5xx.html
  • 有精確的錯誤狀態(tài)碼頁面就匹配精確,沒有就找4xx.html或者N(錯誤狀態(tài)碼首數(shù)字)xx.html;如果都沒有就觸發(fā)白頁

2. 方法一:@ExceptionHandler處理異常

  • 注解用來定義一個或多個具體的異常類型,發(fā)生異常時由此處理
  • @ControllerAdvice+@ExceptionHandler處理全局異常
  • 底層是 ExceptionHandlerExceptionResolver 支持的
/**
 * 處理整個web controller的異常
 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    //定義可以處理的異常
    @ExceptionHandler({ArithmeticException.class,
            NullPointerException.class})
    public String handleArithException(Exception e){
        log.error("異常是:{}",e);
        //返回視圖地址,也可以返回ModelAndView
        return "login";
    }
}

3. 方法二:@ResponseStatus+自定義異常

  • 指定發(fā)生異常時的響應狀態(tài)碼,自定義異常類型
  • 底層是 ResponseStatusExceptionResolver
  • 把ResponseStatus注解的信息組裝成ModelAndView返回
    • 底層調用 response.sendError(statusCode, resolvedReason);
    • tomcat發(fā)送的/error
//異常響應狀態(tài)碼+異常原因
@ResponseStatus(value= HttpStatus.FORBIDDEN,reason = "用戶數(shù)量太多")
public class UserTooManyException extends RuntimeException {
    public  UserTooManyException(){
    }
    public  UserTooManyException(String message){
        super(message);
    }
}

4.  Spring底層的異常

  • 如參數(shù)類型轉換異常
  • DefaultHandlerExceptionResolver 處理框架底層的異常
    • 解析異常時做了一系列異常類型的判斷
    • 每個異常處理都會執(zhí)行response.sendError(.....),tomcat發(fā)送/error請求
    • 如果還是解析不了,就會響應tomcat的錯誤頁面

5. 方法三:自定義實現(xiàn) HandlerExceptionResolver 處理異常

  • @Order(value = Ordered.HIGHEST_PRECEDENCE) 將優(yōu)先級設為最高
  • 如果不加優(yōu)先級,默認是排列在自動配置的異常處理器之后,若默認的處理器可以處理異常,故自定義的異常處理器不會生效
  • 調用response.sendError(.....),tomcat發(fā)送/error請求
//優(yōu)先級,數(shù)字越小優(yōu)先級越高
@Order(value= Ordered.HIGHEST_PRECEDENCE)
@Component
public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response,
                                         Object handler, Exception ex) {
        try {
            //狀態(tài)碼+異常信息
            response.sendError(511,"我喜歡的錯誤");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ModelAndView();
    }
}

6. 關于response.sendError()

  • 自己調用response.sendError(),請求會被轉發(fā)給basicErrorController進行處理
  • 如果自己沒有調用,并且異常沒有任何人能夠處理,tomact底層會自動調用response.sendError()將請求轉發(fā)給basicErrorController處理。
  • 總之,三種方法最后都會調用sendError()轉交給basicErrorController處理,ErrorViewResolver進行解析,最后會轉到一個頁面或者返回json數(shù)據(jù)。

異常處理自動配置原理

  • ErrorMvcAutoConfiguration 自動配置異常處理規(guī)則

1. 綁定配置文件的server spring.mvc 

2. 自動添加組件:類型:DefaultErrorAttributes -> id:errorAttributes

  • DefaultErrorAttributes:定義錯誤頁面中可以包含哪些數(shù)據(jù)
  • DefaultErrorAttributes implements ErrorAttributes,HandlerExceptionResolver
  • 自定義錯誤頁面屬性

3. 自動添加組件:類型:BasicErrorController --> id:basicErrorController

  • 可以通過BasicErrorController 自定義頁面跳轉邏輯
  • 處理默認 /error 路徑的請求;頁面響應 new ModelAndView("error", model),
    • 要么響應一個HTML頁面,要么響應一個json

  • 容器中有組件 View->id是error;(響應默認錯誤頁)

  • 容器中放組件 BeanNameViewResolver(視圖解析器);按照返回的視圖名作為組件的id去容器中找View對象

4. 自動添加組件:類型:DefaultErrorViewResolver -> id:conventionErrorViewResolver

  • 如果發(fā)生錯誤,會以HTTP的狀態(tài)碼 作為視圖名字(viewName),找到真正的頁面
  • 比如error/404、5xx.html

異常處理步驟流程

  • 舉例,執(zhí)行一個controller方法,除數(shù)為0拋出異常

1. doDispatch()中執(zhí)行controller目標方法

  • 目標方法運行期間有任何異常都會被catch、而且標志當前請求結束
  • 并且將異常賦值給 dispatchException
  • 即使目標方法發(fā)生異常,也執(zhí)行視圖解析流程

2. 處理handler發(fā)生的異常,處理完成返回ModelAndView

  •  遍歷所有的 handlerExceptionResolvers,看誰能處理當前異常【HandlerExceptionResolver處理器異常解析器】
    • DefaultErrorAttributes先來處理異常,把異常信息保存到request域,并且返回null
    • 然后交由HandlerExceptionResolverComposite,遍歷其中的異常處理器處理,但此例子默認無法處理
      • ExceptionHandlerExceptionResolver,使用注解@ExceptionHandler才能由此解析處理
      • ResponseStatusExceptionHandler,使用注解@ResponseStatus才能由此解析處理

3. 默認無法處理目標方法異常時,異常會被拋出

  • 底層就會發(fā)送 /error 請求,會被BasicErrorController處理

  • 解析錯誤視圖;遍歷所有的 ErrorViewResolver 看誰能解析

4. 模板引擎響應出錯誤視圖

  • 默認的 DefaultErrorViewResolver ,作用是把響應狀態(tài)碼作為錯誤頁的地址,error/500.html
  • 查找順序:
    • '/templates/error/500.html' >
    • '/static/error/500.html' >
    • '/templates/error/5xx.html' >
    • '/static/error/5xx.html'

相關文章

  • Java正則表達式API Matcher類方法

    Java正則表達式API Matcher類方法

    這篇文章主要介紹了Java正則表達式API Matcher類方法,對Matcher類的一些有用方法進行功能對它們進行分組展開介紹,需要的朋友可以參考一下
    2022-06-06
  • 如何修改JSON字符串中的敏感信息

    如何修改JSON字符串中的敏感信息

    這篇文章主要介紹了如何修改JSON字符串中的敏感信息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot下使用MyBatis-Puls代碼生成器的方法

    SpringBoot下使用MyBatis-Puls代碼生成器的方法

    這篇文章主要介紹了SpringBoot下使用MyBatis-Puls代碼生成器的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot整合Swagger接口文檔工具的流程步驟

    SpringBoot整合Swagger接口文檔工具的流程步驟

    我們在開發(fā)接口的時候,會將接口文檔給前端的開發(fā)者進行對接,我們可以通過Postman或者Yapi等接口管理工具進行編寫管理,實際開發(fā)中,接口的管理確實也應該通過專業(yè)的工具管理,本文,我們就來談談怎么在SpringBoot整合Swagger接口文檔工具
    2023-08-08
  • Spring Cloud Ribbon客戶端詳細介紹

    Spring Cloud Ribbon客戶端詳細介紹

    Spring Cloud Ribbon 是一套基于 Netflix Ribbon 實現(xiàn)的客戶端負載均衡和服務調用工具。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務的REST模版請求自動轉換成客戶端負載均衡的服務調用
    2022-09-09
  • SpringBoot整合Minio實現(xiàn)文件上傳和讀取功能

    SpringBoot整合Minio實現(xiàn)文件上傳和讀取功能

    最近有一個需求是關于視頻上傳播放的,需要設計一個方案,中間談到了Minio這個技術,于是來學習一下,所以本文給大家介紹了SpringBoot整合Minio實現(xiàn)文件上傳和讀取功能,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • Java字節(jié)碼文件(.class)的組成圖文詳解

    Java字節(jié)碼文件(.class)的組成圖文詳解

    Java字節(jié)碼是Java程序在運行時被JVM(Java虛擬機)解釋執(zhí)行的一種中間語言,這篇文章主要介紹了Java字節(jié)碼文件(.class)組成的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-08-08
  • MybatisX快速生成增刪改查的方法示例

    MybatisX快速生成增刪改查的方法示例

    MybatisX是基于IDEA的MyBatis/MyBatis-Plus開發(fā)插件,本文主要介紹了MybatisX快速生成增刪改查的方法示例,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • Spring Boot 2 實戰(zhàn):自定義啟動運行邏輯實例詳解

    Spring Boot 2 實戰(zhàn):自定義啟動運行邏輯實例詳解

    這篇文章主要介紹了Spring Boot 2 實戰(zhàn):自定義啟動運行邏輯,結合實例形式詳細分析了Spring Boot 2自定義啟動運行邏輯詳細操作技巧與注意事項,需要的朋友可以參考下
    2020-05-05
  • spring boot整合netty的實現(xiàn)方法

    spring boot整合netty的實現(xiàn)方法

    這篇文章主要介紹了spring boot整合netty的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08

最新評論

黄浦区| 武乡县| 灵武市| 南昌市| 太仓市| 乐亭县| 额尔古纳市| 惠州市| 通化县| 登封市| 正宁县| 鸡西市| 湖州市| 崇信县| 九龙城区| 乌恰县| 惠水县| 江达县| 罗山县| 满城县| 成安县| 达州市| 年辖:市辖区| 河曲县| 武功县| 区。| 墨江| 佛教| 浦北县| 青铜峡市| 白河县| 班玛县| 大邑县| 精河县| 晋中市| 南溪县| 辽宁省| 黄平县| 彩票| 左云县| 广宗县|