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;
}
}