spring boot / cloud (二) 規范響應格式以及統一異常處理
前言
為什么規范響應格式?
我認為,采用預先約定好的數據格式,將返回數據(無論是正常的還是異常的)規范起來,有助於提高團隊間接口對接的效率(前端和后端,后端和后端等).
思路
-
自定義統一的ResposeBody類 : 用於統一響應格式
-
自定義統一的Error類 : 用於統一異常格式
-
自定義異常 : 區分不同場景的異常
-
實現ExceptionHandler : 用於攔截處理異常
實現
1.創建ErrorResult類
public class ErrorResult implements Serializable {
........省略
//異常發生時間
private Date exceptionDate;
//異常類名
private String exceptionType;
//異常描述
private String exceptionMessage;
//異常堆棧
private String exceptionStackTrace;
........省略
}
2.創建RestResponse類
使用泛型,來適應不同類型的結果集
響應代碼和響應描述,可自定義枚舉來規范
注意,一定有留有無參的構造函數,否則json轉換會報錯
public class RestResponse<T> implements Serializable {
........省略
//響應ID
private String id = UUID.randomUUID().toString();
//響應代碼
private String code = "SUCCESS";
//響應描述
private String message = "操作成功";
//響應體
private T result = null;
//錯誤體
private ErrorResult error = null;
//構造函數
public RestResponse() {
super();
}
//構造函數
public RestResponse(ErrorCode errorCode, ErrorResult error) {
super();
this.code = errorCode.name();
this.message = errorCode.value();
this.error = error;
}
........省略
}
3.自定義異常
檢查型異常
public class SystemException extends Exception {
........省略
}
運行時異常
public class SystemRuntimeException extends RuntimeException {
........省略
}
其他類型異常,如:認證異常,權限異常,參數校驗異常,等等,按需定義
public class AuthException extends RuntimeException {
........省略
}
4.創建ExceptionMapping類
@ControllerAdvice
public class ExceptionMapping {
........省略
}
定義私有的方法構造ErrorResult
private ErrorResult buildError(Exception exception) {
ErrorResult error = new ErrorResult();
error.setType(exception.getClass().getName());
error.setMessage(ExceptionUtils.getMessage(exception));
error.setStackTrace(ExceptionUtils.getStackTrace(exception));
error.setDate(new Date());
return error;
}
按照異常類型,攔截處理異常,攔截的優先級遵循類的集成關系,優先攔截子類異常
@ExceptionHandler(value = 要攔截的異常.class)
@ResponseStatus(響應狀態)
@ResponseBody
public RestResponse<String> exception(要攔截的異常 exception) {
return new RestResponse<>(ErrorCode.ERROR, buildError(exception));
}
這里提醒注意點,如果想要攔截404錯誤的話,需要在spring boot中做如下設置
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
代碼倉庫 (博客配套代碼)
結束
然后相關思路和原則,大家可自行搜索契約優先
,由於本身不想在文章中引入太多教條性的東西,主要都是以解決問題的思路為主,所以不深入討論.
想獲得最快更新,請關注公眾號