首頁 > 軟體

SpringBoot實現統一封裝返回前端結果集的範例程式碼

2022-06-11 14:01:48

在實際專案開發過程中、事實上我們經常用@restcontroller註釋的方式,將相當於將返回資料的基本形式統一為JSON格式的資料。但是,由於我們的專案可能是由很多人開發的,所以我們最好將返回的結果統一起來,這樣每個人都可以返回相同的資料格式,這不僅規範了程式碼,也方便了前端人員呼叫,否則每個人都會按照自己的風格編寫,程式碼會變得非常混亂。

我們如何封裝這個結果?我們應該注意返回到前端的資料中包含的資訊。

一般來說,首先,這次必須有一個code來表示介面的狀態。例如,0表示成功,1表示失敗,2表示必須傳遞錯誤的引數,4表示系統異常,依此類推。這只是一個簡單的例子。許多人可能會有疑問。HTTP協定本身已經有了相應的返回程式碼定義。 例如: 200表示成功, 500表示伺服器錯誤, 404表示找不到頁面。

例如,200表示請求成功,但它不能描述請求中的業務結果。 例如,使用者名稱已經存在,事實上,業務並不成功,但HTTP的結果肯定是200, 因此我們需要一個程式碼來描述我們的業務狀態。

除了程式碼之外,還有一些提示資訊,如操作成功、系統異常、使用者名稱已經存在等,所以我們新增了一個message欄位。

此外,還有我們的核心資料。例如,我根據ID獲取資料。此資料的具體內容必須返回到前端,因此必須有資料。此資料使用什麼型別?這種型別必須是多樣的,所以我們需要使用統一的父類別,以便物件可以接收所有型別。當然,我們可以使用一些通用方法來方便操作。

然後還有我們的核心資料。例如,我根據ID獲取資料。此資料的具體內容必須返回到前端,因此必須有資料。此資料使用什麼型別?這種型別必須是多樣的,所以我們需要使用統一的父類別,以便物件可以接收所有型別。當然,我們可以使用通用方法來方便操作。

主要程式碼展示:

public class Result<T> implements Serializable {
   private static final long serialVersionUID = -3960261604608758516L;
  private int code;
  private String msg;
  private T data;
  public static <T> Result<T> success() {
        return new Result<>();
    }
 
    /**
     * 成功,預設狀態碼,返回訊息,自定義返回資料
     * @param data 自定義返回資料
     * @param <T>  返回類泛型,不能為String
     * @return 通用返回Result
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(data);
    }
 
     /**
     * 成功,預設狀態碼,自定義返回訊息,返回資料
     * @param msg  自定義返回訊息
     * @param data 自定義返回資料
     * @param <T>  返回類泛型
     * @return 通用返回Result
     */
    public static <T> Result<T> success(String msg, T data) {
        return new Result<>(msg, data);
    }
           /**
     * 成功,預設狀態碼,自定義返回訊息,無返回資料
     *
     * @param msg 自定義返回訊息
     * @param <T> 返回類泛型
     * @return 通用返回Result
     */
    public static <T> Result<T> success(String msg) {
        return new Result<>(msg);
    }
     /**
     * 失敗,預設狀態碼,返回訊息,無返回資料
     * @param <T> 返回類泛型
     * @return 通用返回Result
     */
    public static <T> Result<T> error() {
        return new Result<>(ResultCode.ERROR);
    }
     /**
     * 失敗,預設狀態碼,自定義返回訊息,無返回資料
     * @param <T> 返回類泛型
     * @return 通用返回Result
     */
    public static <T> Result<T> error(String msg) {
        return new Result<>(ResultCode.ERROR.getCode(), msg);
    }
     /**
     * 失敗,自定義狀態碼,返回訊息,無返回資料
     * @param code 自定義狀態碼
     * @param msg  自定義返回訊息
     * @param <T>  返回類泛型
     * @return 通用返回Result
     */
    public static <T> Result<T> error(int code, String msg) {
        return new Result<>(code, msg);
    }
     /**
     * 失敗,使用CodeMsg狀態碼,返回訊息,無返回資料
      * @param resultCode CodeMsg,引數如下:
     *                   <p> code 狀態碼
     *                   <p> msg  返回訊息
     * @param <T>        返回類泛型
     * @return 通用返回Result
     */
    public static <T> Result<T> error(ResultCode resultCode) {
        return new Result<>(resultCode);
    }
     /**
     * 成功構造器,無返回資料
     */
    private Result() {
        this(ResultCode.SUCCESS);
    }
     /**
     * 成功構造器,自定義返回資料
     * @param data 返回資料
     */
    private Result(T data) {
        this(ResultCode.SUCCESS, data);
    }
     /**
     * 成功構造器,自定義返回訊息,無返回資料
     * @param msg 返回訊息
     */
    private Result(String msg) {
        this(ResultCode.SUCCESS.getCode(), msg);
    }
           /**
     * 構造器,自定義狀態碼,返回訊息
     * @param code 狀態碼
     * @param msg  返回訊息
     */
    private Result(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
     /**
     * 成功構造器,自定義返回資訊,返回資料
     * @param msg  返回資訊
     * @param data 返回資料
     */
    private Result(String msg, T data) {
        this(ResultCode.SUCCESS.getCode(), msg, data);
    }
 
    /**
     * 構造器,自定義狀態碼,返回訊息,返回資料
     * @param code 狀態碼
     * @param msg  返回訊息
     * @param data 返回資料
     */
    private Result(int code, String msg, T data) {
        this(code, msg);
        this.data = data;
    }
            /**
     * 構造器,使用CodeMsg狀態碼與返回資訊,自定義返回資料
     * @param resultCode CodeMsg,引數如下:
     *                   <p> code 狀態碼
     *                   <p> msg  返回訊息
     * @param data       返回資料
     */
    private Result(ResultCode resultCode, T data) {
        this(resultCode);
        this.data = data;
    }
  
    /**
     * 構造器,使用CodeMsg狀態碼與返回資訊
     * @param resultCode CodeMsg,引數如下:
     *                   <p> code 狀態碼
     *                   <p> msg  返回訊息
     */
    private Result(ResultCode resultCode) {
        this(resultCode.getCode(), resultCode.getMsg());
    }
 
}

還需要定義幾個常見的錯誤

@Builder
public class ResultCode implements Serializable {
     private static final long serialVersionUID = -6269841958947880397L;
     /** 狀態碼*/
    private int code;
     /**狀態資訊*/
    private String msg;
     /** 預設成功*/
    public final static ResultCode SUCCESS = dispose(ResultCodeEnum.SUCCESS);
    /**預設失敗*/
   public final static ResultCode ERROR = dispose(ResultCodeEnum.ERROR);
    /**通用業務異常*/
    public final static ResultCode BIZ_ERROR = dispose(ResultCodeEnum.BIZ_ERROR);
    /**檔案超出最大限制*/
    public final static ResultCode FILE_OUT_MAX = dispose(ResultCodeEnum.FILE_OUT_MAX);
    /**檔案格式不正確*/
    public final static ResultCode FILE_FORMAT_ERROR = dispose(ResultCodeEnum.FILE_FORMAT_ERROR);
    /** 引數錯誤*/
    public final static ResultCode PARAM_ERROR = dispose(ResultCodeEnum.PARAM_ERROR);
    /**Json解析異常*/
    public final static ResultCode JSON_FORMAT_ERROR = dispose(ResultCodeEnum.JSON_FORMAT_ERROR);
    /** Sql解析異常*/
    public final static ResultCode SQL_ERROR = dispose(ResultCodeEnum.SQL_ERROR);
    /**網路超時*/
    public final static ResultCode NETWORK_TIMEOUT = dispose(ResultCodeEnum.NETWORK_TIMEOUT);
    /** 未知的介面*/
    public final static ResultCode UNKNOWN_INTERFACE = dispose(ResultCodeEnum.UNKNOWN_INTERFACE);
    /**請求方式不支援*/
    public final static ResultCode REQ_MODE_NOT_SUPPORTED = dispose(ResultCodeEnum.REQ_MODE_NOT_SUPPORTED);
    /**系統異常*/
    public final static ResultCode SYS_ERROR = dispose(ResultCodeEnum.SYS_ERROR);
    private static ResultCode dispose(ResultCodeEnum codeEnum) {
        return ResultCode.builder().code(codeEnum.getCode()).msg(codeEnum.getMsg()).build();
    }
     public ResultCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

以上就是SpringBoot實現統一封裝返回前端結果集的範例程式碼的詳細內容,更多關於SpringBoot返回前端結果集的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com