1|0springboot之全局處理異常封裝
1|1簡介
在項目中經常出現系統異常的情況,比如NullPointerException
等等。如果默認未處理的情況下,springboot
會響應默認的錯誤提示,這樣對用戶體驗不是友好,系統層面的錯誤,用戶不能感知到,即使為500
的錯誤,可以給用戶提示一個類似服務器開小差
的友好提示等。
在微服務里,每個服務中都會有異常情況,幾乎所有服務的默認異常處理配置一致,導致很多重復編碼,我們將這些重復默認異常處理可以抽出一個公共starter
包,各個服務依賴即可,定制化異常處理在各個模塊里開發。
1|2配置
unified-dispose-springboot-starter
這個模塊里包含異常處理以及全局返回封裝等功能,下面。
完整目錄結構如下:
異常處理
@RestControllerAdvice
或者 @ControllerAdvice
為spring
的異常處理注解。
我們先創建GlobalDefaultExceptionHandler
全局異常處理類:
大致內容處理了一些項目常見的異常Exception
,BindException
參數異常等。
這里將默認的404
、405
、415
等默認http
狀態碼也重寫了。
重寫這個默認的狀態碼需要配置throw-exception-if-no-handler-found
以及add-mappings
。
ps: 請注意這兩個配置會將靜態資源忽略。
請產考WebMvcAutoConfiguration#addResourceHandlers
Exception
為了防止未知的異常沒有防護到,默認給用戶返回服務器開小差,請稍后再試
等提示。
具體異常默認會以小到大去匹配。
如果拋出BindException
,自定義有BindException
就會去這個處理器里處理。沒有就會走到它的父類去匹配,請參考java-異常體系
。
其他已知異常可以自己用@ExceptionHandler
注解進行捕獲處理。
通用異常枚舉
為了避免異常值不好維護,我們使用CommonErrorCode
枚舉把常見的異常提示維護起來。
其實starter
包中不建議使用@Getter
等lombok
注解,防止他人未使用lombok
依賴該項目出現問題。
通用業務異常
這兩個類完成基本可以正常使用異常攔截了,不過為了業務方便,我們創建一個一般通用的業務異常。
BusinessException
繼承RuntimeException
即可。
將BusinessException
加入GlobalDefaultExceptionHandler
全局異常攔截。
程序主動拋出異常可以通過下面方式:
通常不建議直接拋出通用的BusinessException異常,應當在對應的模塊里添加對應的領域的異常處理類以及對應的枚舉錯誤類型。
如會員模塊:
創建UserException
異常類、UserErrorCode
枚舉、以及UserExceptionHandler
統一攔截類。
UserException:
UserErrorCode:
UserExceptionHandler:
最后業務使用如下:
加入spring容器
最后將GlobalDefaultExceptionHandler
以bean
的方式注入spring
容器。
將GlobalDefaultConfiguration
在resources/META-INF/spring.factories
文件下加載。
不過我們這次使用注解方式開啟。其他項目依賴包后,需要添加@EnableGlobalDispose
才可以將全局攔截的特性開啟。
將剛剛創建的spring.factories
注釋掉,創建EnableGlobalDispose
注解。
使用@Import
將GlobalDefaultConfiguration
導入即可。
使用
添加依賴
啟動類開啟@EnableGlobalDispose
注解即可。
1|3總結
項目里很多重復的code,我們可以通過一定的方式去簡化,以達到一定目的減少開發量。
示例代碼地址:unified-dispose-springboot
作者GitHub:
Purgeyao 歡迎關注