這篇文章裏,我們會對返回結果進行一個封裝,然後配置一個handler整合進我們的程序裏
前言
這裏的應用場景介紹:當我們提供後端API給前端時,我們需要告訴前端,這個API調用是否成功:
- 成功,渲染在頁面
- 失敗,返回失敗原因
------->我們的全局訪問信息:
- 成功,返回成功的狀態碼+數據
- 失敗,返回失敗的狀態碼+錯誤提示
因此我們就要封裝一個CommonResult的統一返回類
統一返回類CommonResult的封裝
public class CommonResult<T> implements Serializable {
public static Integer CODE_SUCCESS = 0;
/**
* 錯誤碼
*/
private Integer code;
/**
* 錯誤提示
*/
private String message;
/**
* 返回數據
*/
private T data;
/**
* 將傳入的result對象,轉換成另外一個泛型結果
*
* 因爲A方法返回的CommonResult對象,不滿足調用其的B方法的返回,所以需要繼續轉換。
*
* @param result 傳入的result對象
* @param <T> 返回的泛型
* @return 新的CommonResult對象
*/
public static <T> CommonResult<T> error(CommonResult<?> result) {
return error(result.getCode(), result.getMessage());
}
public static <T> CommonResult<T> error(Integer code, String message) {
Assert.isTrue(!CODE_SUCCESS.equals(code), "code必須是錯誤的");
CommonResult<T> commonResult = new CommonResult<>();
commonResult.code = code;
commonResult.message = message;
return commonResult;
}
public static <T> CommonResult<T> success(T data) {
CommonResult<T> result = new CommonResult<>();
result.code = CODE_SUCCESS;
result.data = data;
result.message = "";
return result;
}
@JsonIgnore //忽略避免jackson序列化給前端
public boolean isSuccess() {//方便判斷是否成功
return CODE_SUCCESS.equals(code);
} //判斷是否成功
@JsonIgnore
public boolean isError() {
return !isSuccess();
}
@Override
public String toString() {
return "CommonResult{" +
"code=" + code +
", message='" + message + '\'' +
", data=" + data +
'}';
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
這裏類封裝的行爲,已經在前言裏分析清楚了,所以也沒什麼需要解釋的
全局統一處理器
@ControllerAdvice(basePackages = "com.zzaxg.springboot.controller")
//實現ResponseBodyAdvice接口就是爲了攔截接口返回結果,並進行處理
public class GlobalResponseBodyHandler implements ResponseBodyAdvice {
/**
* 表示攔截controller所有API的返回結果
*
* @param methodParameter
* @param aClass
* @return
*/
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
return true;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
//如果已經是 CommonResult類型,則直接返回
if (o instanceof CommonResult) {
return o;
}
//如果不是,則包裝成CommonResult類型
return CommonResult.success(o);
}
}
既然api能夠返回結果,自然就是成功訪問量,就調用了success方法,拋出異常的話會在後面的一篇文章SpringBoot整合SpringMVC之全局異常處理進行處理
資料--controller
/**
* 獲得指定用戶編號的用戶
*
* 提供不使用 CommonResult 包裝
*
* @param id 用戶編號
* @return 用戶
*/
@GetMapping("/get")
public UserVO get(@RequestParam("id") Integer id) {
// 查詢並返回用戶
return new UserVO().setId(id).setUsername(UUID.randomUUID().toString());
}
這裏只是模仿了一下controller調用的過程
效果
postman提交localhost:8080/users/get?id=1的get請求
{
"code": 0,
"message": "",
"data": {
"id": 1,
"username": "bbc11a37-b660-4cc7-b3cf-bb5908999fa1"
}
}
謝謝觀看
原文參考芋道