SpringBoot統(tǒng)一響應(yīng)和統(tǒng)一異常處理詳解
一、前言
在開發(fā)Spring Boot應(yīng)用時(shí),處理響應(yīng)結(jié)果和異常的方式對項(xiàng)目的可維護(hù)性、可擴(kuò)展性和團(tuán)隊(duì)協(xié)作有著至關(guān)重要的影響。分散的響應(yīng)結(jié)果和異常處理邏輯往往會導(dǎo)致代碼冗余、難以理解和維護(hù)。因此,統(tǒng)一結(jié)果返回和統(tǒng)一異常處理是提升項(xiàng)目質(zhì)量的關(guān)鍵策略之一。
二、統(tǒng)一結(jié)果返回
統(tǒng)一結(jié)果返回通常意味著為所有控制器方法定義一個(gè)標(biāo)準(zhǔn)的響應(yīng)格式。這可以通過創(chuàng)建一個(gè)或多個(gè)響應(yīng)實(shí)體類來實(shí)現(xiàn),這些類包含了狀態(tài)碼、消息和數(shù)據(jù)等通用字段??刂破鞣椒ㄔ谔幚硗陿I(yè)務(wù)邏輯后,會填充這些字段并返回給客戶端。
接下來讓我們一起看看在SpringBoot中如何實(shí)現(xiàn)統(tǒng)一結(jié)果返回。
1. 定義通用的響應(yīng)對象
創(chuàng)建一個(gè)通用響應(yīng)對象,定義成功和失敗的返回場景,并確保該通用返回對象在接口中得到使用。
public class ResponseResult { private int code; private String message; private Object data; public static ResponseResult success(Object data) { ResponseResult responseResult = new ResponseResult(); responseResult.setData(data); responseResult.setCode(ResultEnum.SUCCESS.code); return responseResult; } public static ResponseResult error(ResultEnum resultEnum) { return error(resultEnum, resultEnum.message); } public static ResponseResult error(ResultEnum resultEnum, String message) { ResponseResult responseResult = new ResponseResult(); responseResult.setCode(resultEnum.code); responseResult.setMessage(message); return responseResult; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
2. 定義接口響應(yīng)狀態(tài)碼
定義一組公共狀態(tài)碼是統(tǒng)一結(jié)果返回的核心關(guān)鍵之一。這種做法不僅提高了API的易用性和可維護(hù)性,還使得客戶端能夠更高效地解析和處理響應(yīng)數(shù)據(jù),同時(shí)也為API的開發(fā)者提供了一個(gè)清晰、一致的標(biāo)準(zhǔn)來遵循。
public enum ResultEnum { SUCCESS(200 ,"請求處理成功"), SERVICE_ERROR(500, "服務(wù)器異常,請稍后重試"); public final Integer code; public final String message; ResultEnum(Integer code, String message) { this.code = code; this.message = message; } }
3. 定義統(tǒng)一的成功和失敗的處理方法
public class ResponseResult { private int code; private String message; private Object data; public static ResponseResult success(Object data) { ResponseResult responseResult = new ResponseResult(); responseResult.setData(data); responseResult.setCode(ResultEnum.SUCCESS.code); return responseResult; } public static ResponseResult error(ResultEnum resultEnum) { return error(resultEnum, resultEnum.message); } public static ResponseResult error(ResultEnum resultEnum, String message) { ResponseResult responseResult = new ResponseResult(); responseResult.setCode(resultEnum.code); responseResult.setMessage(message); return responseResult; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
4. Controller統(tǒng)一響應(yīng)結(jié)果
@GetMapping("/testResult") public ResponseResult test() { // 模擬業(yè)務(wù)邏輯 try { // 假設(shè)這里有一些業(yè)務(wù)邏輯 return ResponseResult.success("success"); } catch (Exception e) { // 捕獲異常并返回錯(cuò)誤信息 return ResponseResult.error(ResultEnum.SERVICE_ERROR); } }
三、統(tǒng)一異常處理
統(tǒng)一異常處理則是通過全局異常處理器來捕獲并處理控制器中拋出的異常。這種方式可以避免在每個(gè)控制器方法中編寫重復(fù)的異常處理代碼,同時(shí)也使得異常處理邏輯更加集中和易于管理。
@RestControllerAdvice
@RestControllerAdvice 是一個(gè)組合注解,它是 @ControllerAdvice 和 @ResponseBody 的結(jié)合體。它主要用于為控制器(Controller)層提供全局的配置,如異常處理、數(shù)據(jù)綁定、數(shù)據(jù)預(yù)處理等。由于它包含了 @ResponseBody,所以所有通過 @RestControllerAdvice 處理的方法都會默認(rèn)將返回值寫入HTTP響應(yīng)體中,并設(shè)置合適的Content-Type。
@ExceptionHandler
@ExceptionHandler注解用于標(biāo)記一個(gè)方法,該方法用于處理控制器中拋出的異常。當(dāng)控制器中的方法拋出異常時(shí),Spring會查找是否有@ExceptionHandler注解的方法能夠處理該異常。如果有,則調(diào)用該方法,并返回其響應(yīng)。
注意
當(dāng)使用@ControllerAdvice時(shí),我們需要將@ResponseBody添加到異常處理方法上。
如果我們使用@RestControllerAdvice,就不需要添加。
1.定義業(yè)務(wù)異常類
統(tǒng)一異常類可以幫助你更好地管理錯(cuò)誤和異常,使得整個(gè)系統(tǒng)的錯(cuò)誤處理更加一致和可預(yù)測。
public class BusinessException extends RuntimeException{ private final ResultEnum resultEnum; public BusinessException(ResultEnum resultEnum, String message) { super(message); this.resultEnum = resultEnum; } public BusinessException(ResultEnum resultEnum) { this(resultEnum, resultEnum.message); } }
2. 全局異常處理器
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler({BusinessException.class}) public ResponseResult handleBusinessException(BusinessException businessException, HttpServletRequest request) { // 想處理的業(yè)務(wù) return ResponseResult.error(ResultEnum.SERVICE_ERROR, businessException.getMessage()); } /** * 其他異常 * @param e * @return */ @ExceptionHandler(value = Exception.class) public ResponseResult handleOtherExceptions(Exception e) { // 這里可以根據(jù)不同的異常類型返回不同的狀態(tài)碼和消息 // 但為了簡單起見,這里只返回一個(gè)通用的錯(cuò)誤信息 return ResponseResult.error(ResultEnum.SERVICE_ERROR); } }
3. 統(tǒng)一處理使用
@GetMapping("/testException1") public ResponseResult test1() { if (true) { // 業(yè)務(wù)場景 throw new BusinessException(ResultEnum.SERVICE_ERROR); } return ResponseResult.success("success"); }
統(tǒng)一異常處理使用好處
代碼復(fù)用:避免了在多個(gè)地方編寫相似的響應(yīng)結(jié)果和異常處理代碼。
易于維護(hù):當(dāng)需要修改響應(yīng)格式或異常處理邏輯時(shí),只需在一個(gè)地方進(jìn)行修改。
團(tuán)隊(duì)協(xié)作:團(tuán)隊(duì)成員可以更容易地理解和遵循統(tǒng)一的編碼規(guī)范。
擴(kuò)展性:如果需要添加新的響應(yīng)類型或異常處理邏輯,只需在現(xiàn)有基礎(chǔ)上進(jìn)行擴(kuò)展。
到此這篇關(guān)于SpringBoot統(tǒng)一響應(yīng)和統(tǒng)一異常處理詳解的文章就介紹到這了,更多相關(guān)SpringBoot統(tǒng)一相應(yīng)和異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用lamda表達(dá)式對list進(jìn)行求和
這篇文章主要介紹了如何使用lamda表達(dá)式對list進(jìn)行求和問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Java對象轉(zhuǎn)Json,關(guān)于@JSONField對象字段重命名和順序問題
這篇文章主要介紹了Java對象轉(zhuǎn)Json,關(guān)于@JSONField對象字段重命名和順序問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08java開發(fā)分布式服務(wù)框架Dubbo服務(wù)引用過程詳解
這篇文章主要為大家介紹了java開發(fā)分布式服務(wù)框架Dubbo服務(wù)引用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11