SpringBoot結(jié)果封裝和異常攔截的實(shí)現(xiàn)示例
在 SpringBoot 項(xiàng)目中,我們通常需要將結(jié)果數(shù)據(jù)封裝成特定的格式,以方便客戶(hù)端進(jìn)行處理。我們可以將封裝結(jié)果的代碼封裝成一個(gè)工具類(lèi)或統(tǒng)一的響應(yīng)類(lèi)型,以簡(jiǎn)化代碼的編寫(xiě)工作,并且方便統(tǒng)一管理。下面介紹一個(gè)簡(jiǎn)單的例子,說(shuō)明如何對(duì) SpringBoot 返回結(jié)果進(jìn)行封裝。
1. 定義 CommonResult 類(lèi)
我們可以定義一個(gè)名為 CommonResult<T> 的類(lèi),用于封裝接口的響應(yīng)結(jié)果。它包含三個(gè)字段,分別對(duì)應(yīng)了狀態(tài)碼 code、響應(yīng)消息 msg 和響應(yīng)數(shù)據(jù) data,其中數(shù)據(jù)類(lèi)型為泛型 T。code 字段是 int 類(lèi)型的。
public class CommonResult<T> { ? ? private int code; ?// 響應(yīng)狀態(tài)碼 ? ? private String msg; ?// 響應(yīng)消息 ? ? private T data; ?// 響應(yīng)數(shù)據(jù) ? ? // 構(gòu)造器 ? ? public CommonResult() {} ? ? public CommonResult(int code, String msg, T data) { ? ? ? ? this.code = code; ? ? ? ? this.msg = msg; ? ? ? ? this.data = data; ? ? } ? ? // 省略 Getter 和 Setter 方法 }
2. 定義響應(yīng)碼 ResponseCode
為了方便管理和調(diào)用響應(yīng)狀態(tài)碼,我們可以定義一個(gè)名為 ResponseCode 的類(lèi),用來(lái)統(tǒng)一管理響應(yīng)狀態(tài)碼。
public enum ResponseCode { ? ? SUCCESS(200, "操作成功"), ? ? FAIL(500, "操作失敗"); ? ? // 狀態(tài)碼和狀態(tài)信息 ? ? private final int code; ? ? private final String message; ? ? // 構(gòu)造器 ? ? private ResponseCode(int code, String message) { ? ? ? ? this.code = code; ? ? ? ? this.message = message; ? ? } ? ? // Getter 方法 ? ? public int getCode() { ? ? ? ? return code; ? ? } ? ? public String getMessage() { ? ? ? ? return message; ? ? } }
在這里我們只定義了兩種響應(yīng)狀態(tài)碼,分別是成功和失敗,對(duì)應(yīng)的狀態(tài)碼分別為 200 和 500。在實(shí)際項(xiàng)目中,我們可以根據(jù)實(shí)際業(yè)務(wù)場(chǎng)景定義更多的響應(yīng)狀態(tài)碼。
3. 自定義異常 BizException
我們還可以定義一個(gè)自定義異常類(lèi) BizException,用于處理自定義異常場(chǎng)景,并在 GlobalExceptionHandler 中進(jìn)行攔截與處理。
public class BizException extends RuntimeException { ? ? private int code; ? ? public BizException(ResponseCode responseCode) { ? ? ? ? super(responseCode.getMessage()); ? ? ? ? this.code = responseCode.getCode(); ? ? } ? ? // Getter 方法 ? ? public int getCode() { ? ? ? ? return code; ? ? } }
Biz是英文Business的縮寫(xiě),表示業(yè)務(wù)中發(fā)生的異常。
在該類(lèi)中,我們定義了響應(yīng)狀態(tài)碼對(duì)應(yīng)的異常,并在構(gòu)造方法中傳入對(duì)應(yīng)的 ResponseCode 來(lái)初始化異常的 code 字段。
4. 統(tǒng)一處理異常情況
在實(shí)際項(xiàng)目中,我們需要對(duì)異常情況進(jìn)行處理,以保證系統(tǒng)的穩(wěn)定性和可控性。因此,我們可以在對(duì)外暴露的 API 接口中添加異常處理機(jī)制,以統(tǒng)一處理系統(tǒng)拋出的異常情況,并防止系統(tǒng)掛掉。
在 SpringBoot 中,我們可以通過(guò)使用 @RestControllerAdvice 和 @ExceptionHandler 注解來(lái)進(jìn)行異常處理。具體實(shí)現(xiàn)方式如下:
@RestControllerAdvice public class GlobalExceptionHandler { ? ? @ExceptionHandler(Exception.class) ? ? public CommonResult<String> handleException(Exception e) { ? ? ? ? log.error("系統(tǒng)異常:{}", e.getMessage()); ? ? ? ? return new CommonResult<>(ResponseCode.FAIL.getCode(), "系統(tǒng)錯(cuò)誤,請(qǐng)聯(lián)系管理員", null); ? ? } ? ? @ExceptionHandler(BizException.class) ? ? public CommonResult<String> handleBizException(BizException e) { ? ? ? ? log.error("業(yè)務(wù)異常:{}", e.getMessage()); ? ? ? ? return new CommonResult<>(e.getCode(), e.getMessage(), null); ? ? } }
在上面的例子中,我們使用了 @RestControllerAdvice 注解來(lái)定義一個(gè)全局的異常處理類(lèi),使用 @ExceptionHandler(Exception.class) 和 @ExceptionHandler(BizException.class) 注解來(lái)分別處理全局異常和自定義的業(yè)務(wù)異常。
當(dāng)系統(tǒng)發(fā)生異常時(shí),會(huì)被 handleException 方法所捕獲,輸出異常日志,并返回一個(gè)業(yè)務(wù)失敗的結(jié)果。而當(dāng)業(yè)務(wù)異常發(fā)生時(shí),會(huì)被 handleBizException 方法所捕獲,返回該業(yè)務(wù)異常對(duì)應(yīng)的狀態(tài)碼、響應(yīng)消息和響應(yīng)數(shù)據(jù)。
5. 使用結(jié)果封裝類(lèi)和模擬異常攔截
@RestController @RequestMapping("/api") public class UserController { ? ? // 省略注入代碼 ? ? @GetMapping("/users/{id}") ? ? public CommonResult<User> getUserById(@PathVariable("id") Long id) { ? ? ? ? User user = userService.getUserById(id); ? ? ? ? if (null != user) { ? ? ? ? ? ? return new CommonResult<>(ResponseCode.SUCCESS.getCode(), ResponseCode.SUCCESS.getMessage(), user); ? ? ? ? } else { ? ? ? ? ? ? throw new BizException(ResponseCode.FAIL); ? ? ? ? } ? ? } }
使用CommonResult<User>來(lái)返回?cái)?shù)據(jù)給前端
throw new BizException(ResponseCode.FAIL);拋出異常后會(huì)在異常攔截器那里攔截統(tǒng)一進(jìn)行處理
6. 總結(jié)
在本篇教程中,我們介紹了如何使用 SpringBoot 來(lái)封裝返回結(jié)果。我們定義了 CommonResult 類(lèi)、ResponseCode 類(lèi)和 BizException 自定義業(yè)務(wù)異常類(lèi),用于封裝響應(yīng)結(jié)果、統(tǒng)一管理響應(yīng)狀態(tài)碼和處理自定義業(yè)務(wù)異常。我們也介紹了如何使用 @RestControllerAdvice 和 @ExceptionHandler 注解來(lái)統(tǒng)一處理異常情況,避免因?yàn)楫惓G闆r導(dǎo)致系統(tǒng)不穩(wěn)定。在實(shí)際項(xiàng)目中,我們可以根據(jù)實(shí)際情況對(duì)以上代碼進(jìn)行修改和調(diào)整,以適應(yīng)不同的業(yè)務(wù)場(chǎng)景。
到此這篇關(guān)于SpringBoot結(jié)果封裝和異常攔截的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot 結(jié)果封裝和異常攔截內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot?過(guò)濾器、攔截器、全局異常處理的方案處理小結(jié)
- SpringBoot全局異常處理機(jī)制和配置攔截器方式
- SpringBoot切面攔截@PathVariable參數(shù)及拋出異常的全局處理方式
- SpringBoot搭建全局異常攔截
- springboot攔截器過(guò)濾token,并返回結(jié)果及異常處理操作
- SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理
- Spring boot項(xiàng)目中異常攔截設(shè)計(jì)和處理詳解
- Spring Boot統(tǒng)一異常攔截實(shí)踐指南(最新推薦)
相關(guān)文章
Spring解決循環(huán)依賴(lài)問(wèn)題及三級(jí)緩存的作用
這篇文章主要介紹了Spring解決循環(huán)依賴(lài)問(wèn)題及三級(jí)緩存的作用,所謂的三級(jí)緩存只是三個(gè)可以當(dāng)作是全局變量的Map,Spring的源碼中大量使用了這種先將數(shù)據(jù)放入容器中等使用結(jié)束再銷(xiāo)毀的代碼風(fēng)格2022-07-07

Springboot Vue可配置調(diào)度任務(wù)實(shí)現(xiàn)示例詳解

RocketMQ中消費(fèi)者概念和消費(fèi)流程詳解

簡(jiǎn)易版SpringBoot自定義模擬實(shí)現(xiàn)

MyBatis-Plus使用sl4j日志打印SQL的代碼詳解

mybatis-plus內(nèi)置雪花算法主鍵重復(fù)問(wèn)題解決