SpringBoot整合SpringMVC之全局統一返回

這篇文章裏,我們會對返回結果進行一個封裝,然後配置一個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"
    }
}

謝謝觀看

原文參考芋道

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章