前言:
通過實踐而發現真理,又通過實踐而證實真理和發展真理。從感性認識而能動地發展到理性認識,又從理性認識而能動地指導革命實踐,改造主觀世界和客觀世界。實踐、認識、再實踐、再認識,這種形式,循環往復以至無窮,而實踐和認識之每一循環的內容,都比較地進到了高一級的程度。
上期回顧:
1:@ControllerAdvice提供了對全局統一響應支持
2:supports與beforBodyWrite關系,用一個三元運算符表示,supports ? beforBodyWrite :異常
3:supports只影響同一文件下的beforeBodyWrite
本期將進入到全局異常中
先創建一個類,我稱其為異常統一類
第一點的:HTTP 狀態碼 | 菜鳥教程
第二點的:異常信息
繼承RuntimeException,自動捕獲運行時的異常
@Data @AllArgsConstructor public class BusinessException extends RuntimeException {/*** 異常編碼* 異常信息*/private int code;private String massage;/*** 無參構造函數*/public BusinessException() {super();} }
隨著實踐的加深
作者 對統一響應進行了更具體的細分
統一響應:成功響應和異常響應
根據它們傳入的參數,又可以具體分為三種:
? ? ? ? 第一種:基本響應????????
? ? ? ? 第二種:自定義信息響應
? ? ? ? 第三種:完全自定義響應
對應形參
第一種:data
第二種:message、data
第三種:code、message、data
有些b人就是喜歡搞一些多余編碼code,美名其曰專業化,之前的版本只有自定義消息,沒做自定義編碼,所以不適用了
public class apiResultYOUYA {/*** 默認成功HTTP狀態碼 (200 OK)*/private static final int OK = HttpStatus.OK.value();/*** 默認錯誤HTTP狀態碼 (500 Internal Server Error)*/private static int NO = HttpStatus.INTERNAL_SERVER_ERROR.value();/*** 基本響應** @param data 響應數據* @param <T> 響應數據類型* @return*/public static <T> apiResult<T> success(T data) {return new apiResult<>(OK, "操作成功", data);}/*** 自定義信息統一響應* @param message 自定義提示信息* @param data 響應數據* @return* @param <T> 響應數據類型*/public static <T> apiResult<T> success(String message, T data) {return new apiResult<>(OK, message, data);}/*** 完全自定義統一響應* @param code 自定義提示編碼* @param message 自定義提示信息* @param data 響應數據* @return* @param <T> 響應數據類型*/public static <T> apiResult<T> success(int code, String message, T data) {return new apiResult<>(code, message, data);}/*** 基本失敗響應* @return* @param <T> 響應數據類型*/public static <T> apiResult<T> error() {return new apiResult<>(NO, "系統錯誤,請聯系管理員");}/*** 自定義信息統一失敗響應* @param message 自定義提示信息* @return* @param <T> 響應數據類型*/public static <T> apiResult<T> error(String message) {return new apiResult<>(NO, message);}/*** 完全自定義統一失敗響應* @param code 自定義編碼* @param message 自定義提示信息* @return* @param <T> 響應數據類型*/public static <T> apiResult<T> error(int code, String message) {return new apiResult<>(code, message);}}
統一異常類處理
@Slf4j @RestControllerAdvice public class GlobalExcResult {@ExceptionHandler(Throwable.class)public apiResult handleException(Throwable throwable){if (throwable instanceof BusinessException businessException){log.info("請求出現業務異常:",throwable);return apiResultYOUYA.error(businessException.getMessage());}log.error("請求出現系統異常:",throwable);return apiResultYOUYA.error("服務器內部錯誤");} }
運行
控制臺打印報錯是因為這兩句
log.error("請求出現系統異常:",throwable);
log.info("請求出現業務異常:",throwable);
這響應內容是包含在data里的,重復了
在統一響應中打上斷點,查看body
if (body instanceof apiResult){return (apiResult)body;}
將它們轉換成apiresult