SpringBoot異常處理統一封裝我來做-使用篇


摘自:https://www.cnblogs.com/Purgeyao/p/11781408.html

簡介

重復功能我來寫。在 SpringBoot 項目里都有全局異常處理以及返回包裝等,返回前端是帶上succcodemsgdata等字段。單個項目情況下很好解決,當微服務模塊多的情況下,很多情況開發都是復制原有代碼進行構建另外一個項目的,導致這些功能升級需要修改多個服務,在這個基礎上,我們封裝了一個組件 unified-dispose-springboot-starter 里面包含了一些基礎的異常處理以及返回包裝功能。

1|2依賴添加啟動功能


添加依賴
ps: 實際version版本請使用最新版
最新版本:

點擊查看最新新版本

<dependency> <groupId>com.purgeteam</groupId> <artifactId>unified-dispose-springboot-starter</artifactId> <version>0.1.1.RELEASE</version> </dependency>

啟動類添加 @EnableGlobalDispose 注解開啟以下功能。

@EnableGlobalDispose @SpringBootApplication public class GlobalDisposeSpringBootApplication { public static void main(String[] args) { SpringApplication.run(GlobalDisposeSpringBootApplication.class, args); } }

1|3One 異常處理⚠️


在項目中經常出現系統異常的情況,比如NullPointerException等等。如果默認未處理的情況下,springboot會響應默認的錯誤提示,這樣對用戶體驗不是友好,系統層面的錯誤,用戶不能感知到,即使為500的錯誤,可以給用戶提示一個類似服務器開小差的友好提示等。

模塊里以及包含了一些基本的異常處理方式(及不需要做任何代碼編寫已經具有基本異常處理),以及一些常見的異常code,用戶只需要關心業務異常處理即可,直接通過 throw new 異常 的方式拋出即可。

異常處理包含類型

# 通用500異常 Exception 類捕獲 500 異常處理 # Feign 異常 FeignException 類捕獲 ClientException 類捕獲 # 業務自定義 BusinessException 類捕獲 業務通用自定義異常 # 參數校驗異常 HttpMessageNotReadableException 參數錯誤異常 BindException 參數錯誤異常

程序主動拋出異常

throw new BusinessException(BusinessErrorCode.BUSINESS_ERROR); // 或者 throw new BusinessException("CLOUD800","沒有多余的庫存");

通常不建議直接拋出通用的BusinessException異常,應當在對應的模塊里添加對應的領域的異常處理類以及對應的枚舉錯誤類型。

如會員模塊:
創建UserException異常類、UserErrorCode枚舉、以及UserExceptionHandler統一攔截類。

UserException:

@Data public class UserException extends RuntimeException { private String code; private boolean isShowMsg = true; /** * 使用枚舉傳參 * * @param errorCode 異常枚舉 */ public UserException(UserErrorCode errorCode) { super(errorCode.getMessage()); this.setCode(errorCode.getCode()); } }

UserErrorCode:

@Getter public enum UserErrorCode { /** * 權限異常 */ NOT_PERMISSIONS("CLOUD401","您沒有操作權限"), ; private String code; private String message; CommonErrorCode(String code, String message) { this.code = code; this.message = message; } }

UserExceptionHandler:

@Slf4j @RestControllerAdvice public class UserExceptionHandler { /** * UserException 類捕獲 */ @ExceptionHandler(value = UserException.class) public Result handler(UserException e) { log.error(e.getMessage(), e); return Result.ofFail(e.getCode(), e.getMessage()); } }

最后業務使用如下:

// 判斷是否有權限拋出異常 throw new UserException(UserErrorCode.NOT_PERMISSIONS);

上述方式,拋出異常后會被模塊處理。前台返回如下

{ "succ": false, // 是否成功 "ts": 1566467628851, // 時間戳 "data": null, // 數據 "code": "CLOUD800", // 錯誤類型 "msg": "業務異常", // 錯誤描述 "fail": true }

1|4Tow 統一返回封🗳


在REST風格的開發中,避免通常會告知前台返回是否成功以及狀態碼等信息。這里我們通常返回的時候做一次util的包裝處理工作,如:Result類似的類,里面包含succcodemsgdata等字段。

接口調用處理類似如下:

@GetMapping("hello") public Result list(){ return Result.ofSuccess("hello"); }

結果:

{ "succ": ture, // 是否成功 "ts": 1566467628851, // 時間戳 "data": "hello", // 數據 "code": null, // 錯誤類型 "msg": null, // 錯誤描述 "fail": true }

功能使用

默認情況所有的 web controller 都會被封裝為一下返回格式。

接口:

@GetMapping("test") public String test(){ return "test"; }

返回

{ "succ": true, // 是否成功 "ts": 1566386951005, // 時間戳 "data": "test", // 數據 "code": null, // 錯誤類型 "msg": null, // 錯誤描述 "fail": false }

忽略封裝注解:@IgnorReponseAdvice

@IgnorReponseAdvice允許范圍為:類 + 方法,標識在類上這個類下的說有方法的返回都將忽略返回封裝。

接口:

@IgnorReponseAdvice // 忽略數據包裝 可添加到類、方法上 @GetMapping("test") public String test(){ return "test"; }

返回 test

1|5總結


項目里很多重復的code,我們可以通過一定的方式去簡化,以達到一定目的減少開發量。PurgeTeam 具有一些優秀的開源組件,減少日常的開發量。

示例代碼地址:unified-dispose-springboot

作者GitHub:
Purgeyao 歡迎關注

qq交流群: 812321371 微信交流群: MercyYao

微信公眾號:

微信公眾號二維碼


__EOF__

作  者:Purgeyao
出  處:https://www.cnblogs.com/Purgeyao
關於博主:大家好,我是purgeyao 一個落寞在魔都的碼農。熱愛生活,愛讀書/旅游,喜歡技術,樂於專研。評論和私信會在第一時間回復。微博 : Purgeyao 知識星球: [小宇宙](https://t.zsxq.com/NFmyVny), GitHub: [Purgeyao](https://github.com/1346735074)
版權聲明:署名 - 非商業性使用 - 禁止演繹,協議普通文本 | 協議法律文本
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角推薦】一下。您的鼓勵是博主的最大動力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM