Spring全局異常捕獲不生效問題的解決辦法
問題場景:
Spring項目全局異常處理不生效,登錄接口報錯異常信息被直接返回到接口響應(yīng)中。
問題描述
同事反饋說系統(tǒng)登錄報錯,查看接口響應(yīng),堆棧信息直接返回前臺了,Debug代碼發(fā)現(xiàn)全局異常捕獲也沒有生效。

原因分析:
先梳理一下Spring全局異常攔截的邏輯:
一,Spring在org.springframework.web.servlet.DispatcherServlet#doDispatch內(nèi)部方法調(diào)用加了try catch機制,攔截所有Exception異常。

二,DispatcherServlet#processDispatchResult方法內(nèi)部再次調(diào)用了processHandlerException方法。

三,processHandlerException 方法負責在 Spring MVC 中協(xié)調(diào)處理處理器執(zhí)行過程中發(fā)生的異常。它首先清理響應(yīng)狀態(tài),然后嘗試通過一系列注冊的 HandlerExceptionResolver 找到合適的異常處理策略,并最終返回一個用于渲染錯誤頁面的 ModelAndView 對象,或者在未能妥善處理異常時重新拋出異常。

解決方案:
先確定異常類型,再檢查異常拋出位置。
- BadSqlGrammarException異常的祖先類繼承了Exception,所以DispatcherServlet#doDispatch方法肯定是可以捕獲該異常的,所以出現(xiàn)問題的原因就在于該異??赡芪唇?jīng)過doDispatch方法。
- 檢查代碼報錯邏輯是在org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter方法中。
- Sevlet容器定義的組件執(zhí)行順序有filter -> servlet -> interceptor -> Controller。
- 所以在filter層拋出的異常,理論上只能在filter層解決,最簡單的方式就是定義一個order靠前的ExceptionFilter來捕獲后續(xù)filter異常。另外也可以基于Tomcat容器來配置全局異常消除:
- 在server.xml中添加一個ErrorReportValve,將showReport設(shè)置為false就隱藏了詳細報錯信息,showServerInfo設(shè)置為false是隱藏Tomcat版本信息。
\<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />
以上就是Spring全局異常捕獲不生效問題的解決辦法的詳細內(nèi)容,更多關(guān)于Spring全局異常捕獲不生效的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot如何統(tǒng)一處理Filter異常
這篇文章主要介紹了Springboot如何統(tǒng)一處理Filter異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
關(guān)于Cannot?resolve?com.microsoft.sqlserver:sqljdbc4:4.0報錯問題解
這篇文章主要給大家介紹了關(guān)于Cannot?resolve?com.microsoft.sqlserver:sqljdbc4:4.0報錯問題的解決辦法,這個是在pom文件中添加依賴出現(xiàn)報錯問題,需要的朋友可以參考下2024-02-02
springboot項目Redis統(tǒng)計在線用戶的實現(xiàn)示例
最近做個項目需要統(tǒng)計在線用戶,本文主要介紹了springboot項目Redis統(tǒng)計在線用戶的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-06-06
使用springboot跳轉(zhuǎn)到指定頁面和(重定向,請求轉(zhuǎn)發(fā)的實例)
這篇文章主要介紹了使用springboot跳轉(zhuǎn)到指定頁面和(重定向,請求轉(zhuǎn)發(fā)的實例),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java數(shù)組使用binarySearch()方法查找指定元素的實現(xiàn)
這篇文章主要介紹了Java數(shù)組使用binarySearch()方法查找指定元素的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
java中synchronized Lock(本地同步)鎖的8種情況
本文主要介紹了java中synchronized Lock(本地同步)鎖的8種情況,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
IDEA版使用Java操作Redis數(shù)據(jù)庫的方法
這篇文章主要介紹了IDEA版使用Java操作Redis數(shù)據(jù)庫的方法,首先需要下載jedis.jar包,然后再工程中設(shè)置具體操作步驟跟隨小編一起學習下吧2021-08-08

