Spring全局異常捕獲不生效問題的解決辦法
問題場(chǎng)景:
Spring項(xiàng)目全局異常處理不生效,登錄接口報(bào)錯(cuò)異常信息被直接返回到接口響應(yīng)中。
問題描述
同事反饋說系統(tǒng)登錄報(bào)錯(cuò),查看接口響應(yīng),堆棧信息直接返回前臺(tái)了,Debug代碼發(fā)現(xiàn)全局異常捕獲也沒有生效。
原因分析:
先梳理一下Spring全局異常攔截的邏輯:
一,Spring在org.springframework.web.servlet.DispatcherServlet#doDispatch內(nèi)部方法調(diào)用加了try catch機(jī)制,攔截所有Exception異常。
二,DispatcherServlet#processDispatchResult方法內(nèi)部再次調(diào)用了processHandlerException方法。
三,processHandlerException 方法負(fù)責(zé)在 Spring MVC 中協(xié)調(diào)處理處理器執(zhí)行過程中發(fā)生的異常。它首先清理響應(yīng)狀態(tài),然后嘗試通過一系列注冊(cè)的 HandlerExceptionResolver 找到合適的異常處理策略,并最終返回一個(gè)用于渲染錯(cuò)誤頁面的 ModelAndView 對(duì)象,或者在未能妥善處理異常時(shí)重新拋出異常。
解決方案:
先確定異常類型,再檢查異常拋出位置。
- BadSqlGrammarException異常的祖先類繼承了Exception,所以DispatcherServlet#doDispatch方法肯定是可以捕獲該異常的,所以出現(xiàn)問題的原因就在于該異??赡芪唇?jīng)過doDispatch方法。
- 檢查代碼報(bào)錯(cuò)邏輯是在org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter方法中。
- Sevlet容器定義的組件執(zhí)行順序有filter -> servlet -> interceptor -> Controller。
- 所以在filter層拋出的異常,理論上只能在filter層解決,最簡(jiǎn)單的方式就是定義一個(gè)order靠前的ExceptionFilter來捕獲后續(xù)filter異常。另外也可以基于Tomcat容器來配置全局異常消除:
- 在server.xml中添加一個(gè)ErrorReportValve,將showReport設(shè)置為false就隱藏了詳細(xì)報(bào)錯(cuò)信息,showServerInfo設(shè)置為false是隱藏Tomcat版本信息。
\<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />
以上就是Spring全局異常捕獲不生效問題的解決辦法的詳細(xì)內(nèi)容,更多關(guān)于Spring全局異常捕獲不生效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java使用正則表達(dá)式截取重復(fù)出現(xiàn)的XML字符串功能示例
這篇文章主要介紹了Java使用正則表達(dá)式截取重復(fù)出現(xiàn)的XML字符串功能,涉及java針對(duì)xml字符串及指定格式字符串的正則匹配相關(guān)操作技巧,需要的朋友可以參考下2017-08-08springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConver
這篇文章主要介紹了springboot?ElasticSearch如何配置自定義轉(zhuǎn)換器ElasticsearchCustomConversions問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08fasterxml jackson反序列化時(shí)對(duì)于非靜態(tài)內(nèi)部類報(bào)錯(cuò)問題及解決
這篇文章主要介紹了fasterxml jackson反序列化時(shí)對(duì)于非靜態(tài)內(nèi)部類報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Java getResource()如何獲取class文件目錄位置
這篇文章主要介紹了Java getResource()如何獲取class文件目錄位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12使用SQL保留兩位小數(shù)的實(shí)現(xiàn)方式
SQL中保留兩位小數(shù)有三種方法:1、使用ROUND()函數(shù)進(jìn)行四舍五入;2、使用CONVERT()函數(shù)和3、CAST()函數(shù)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,這兩種方法會(huì)截?cái)喽嘤嗟奈粩?shù),ROUND()函數(shù)會(huì)保留0位,而CONVERT()和CAST()會(huì)刪除多余的02024-11-11sprinboot項(xiàng)目啟動(dòng)一半到圖形化界面卡住了的解決
這篇文章主要介紹了sprinboot項(xiàng)目啟動(dòng)一半到圖形化界面卡住了的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10SpringBoot中統(tǒng)計(jì)方法耗時(shí)的七種實(shí)現(xiàn)方式小結(jié)
作為開發(fā)者,我們經(jīng)常需要統(tǒng)計(jì)方法的執(zhí)行時(shí)間,以便找出性能瓶頸,優(yōu)化系統(tǒng)響應(yīng)速度,今天分享在SpringBoot框架中實(shí)現(xiàn)方法耗時(shí)統(tǒng)計(jì)的幾種方法,大家可以根據(jù)需求自行選擇2025-03-03