SpringBoot介面格式和規範
阿新 • • 發佈:2021-07-09
SpringBoot介面格式
概述:通過對介面返回格式的統一定義方便接收方統一呼叫和傳送端處理。
通過對響應型別的列舉定義、返回格式的模板化、springboot的統一返回攔截處理和統一返回異常處理。
介面響應標準定義
{
"code": 10001,
"message": "XXXX",
"data": {
"XXX": "XXX"
}
}
響應列舉型別
public class Enum ResultEnum{ SUCCESS(1000,"成功"), SYSTEM_ERROR(5000,"系統內部異常"), //追加自定義型別 ; private Integer code; private String message; ResultEnum(Integer code, String message) { this.code = code; this.message = message; } }
返回型別格式
@Data public class Result<T>{ private Integer code; private String message; private T data; /** * 定義成功無返回值方法 * @return */ public static Result successResult() { return getSuccessResult(); } /** * 定義成功有data方法 * @param data * @return */ public static Result successResult(Object data) { Result result =getSuccessResult(); result.setData(data); return result; } private static Result getSuccessResult(){ Result result = new Result(); result.setCode(ResultEnum.SUCCESS.getCode()); result.setMessage(ResultEnum.SUCCESS.getMessage()); return result; } /** * 定義異常無返回值方法 * @return */ public static Result errorResult() { return getErrorResult(); } /** * 定義成異常有data方法 * @param data * @return */ public static Result errorResult(Object data) { Result result =getErrorResult(); result.setData(data); return result; } private static Result getErrorResult(){ Result result = new Result(); result.setCode(ResultEnum.SYSTEM_ERROR.getCode()); result.setMessage(ResultEnum.SYSTEM_ERROR.getMessage()); return result; } /** * 根據ResultEnum獲取返回值資訊 * @param resultEnum * @param data * @return */ public static Result result(ResultEnum resultEnum,Object data) { Result result = new Result(); result.setCode(resultEnum.getCode()); result.setMessage(resultEnum.getMessage()); result.setData(data); return result; } }
全域性返回值
ResponseBodyAdvice<Object>介面
原始碼閱讀ResponseBodyAdvice的作用:攔截Controller方法的返回值,統一處理返回值/響應體,一般用來做response的統一格式、加解密、簽名等等。
public interface ResponseBodyAdvice <T> { //是否支援攔截 boolean supports(org.springframework.core.MethodParameter methodParameter, java.lang.Class<? extends org.springframework.http.converter.HttpMessageConverter<?>> aClass); //自定義的介面處理 @org.springframework.lang.Nullable T beforeBodyWrite(@org.springframework.lang.Nullable T t, org.springframework.core.MethodParameter methodParameter, org.springframework.http.MediaType mediaType, java.lang.Class<? extends org.springframework.http.converter.HttpMessageConverter<?>> aClass, org.springframework.http.server.ServerHttpRequest serverHttpRequest, org.springframework.http.server.ServerHttpResponse serverHttpResponse); }
自定義的ResponseHandler
//全域性攔截包定義
@RestControllerAdvice(basePackages = "com.xxx.controller")
public class ResponseHandler implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<?
extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
//對返回的Object物件處理
//String 格式是比較特殊的
if (o instanceof String) {
return JSONObject.toJSONString(Result.successResult(o));
}
return Result.successResult(o);
}
}
異常處理介面
@RestControllerAdvice,Springboot提供的對所有的全域性處理方法。
它通常用來定義
@ExceptionHandler
,@InitBinder
以及@ModelAttribute
適用於所有方法@RequestMapping
的方法。
- 異常處理。
- 在其執行之前初始化資料繫結器。
- 把值繫結到Model中,使全域性@RequestMapping可以獲取到該值。
@RestControllerAdvice
public class GlobalExceptionAdvice {
/**
* 處理執行時異常
*/
//定義返回值response的httpcode
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Throwable.class)
public Result handleThrowable(Throwable e, HttpServletRequest request) {
//結合ErrorResult對異常及結果資訊進行捕獲返回
return errorResult;
}
/**
* 處理自定義異常
*/
@ExceptionHandler(BusinessException.class)
public Result handleBusinessException(BusinessException e, HttpServletRequest request) {
//結合ErrorResult對異常及結果資訊進行捕獲返回
return errorResult;
}
}
自定義異常
自定義異常定義使用
引數的校驗。處理,空值物件的引用(NullPointerException)、陣列下標越界(ArrayIndexOutBoundException)
public class BusinessException extends RuntimeException {
protected Integer code;
protected String message;
public BusinessException(ResultEnum resultEnum){
this.code = resultEnum.getCode();
this.errMsg = resultEnum.getMsg();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getErrMsg() {
return errMsg;
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg;
}
}