spring boot / cloud (二) 規范響應格式以及統一異常處理


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

代碼倉庫 (博客配套代碼)

結束

然后相關思路和原則,大家可自行搜索契約優先,由於本身不想在文章中引入太多教條性的東西,主要都是以解決問題的思路為主,所以不深入討論.


想獲得最快更新,請關注公眾號

想獲得最快更新,請關注公眾號


免責聲明!

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



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