SpringBoot實現統一封裝返回前端結果集的示例代碼
在實際項目開發過程中、事實上我們經常用@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返回前端結果集的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- SpringBoot 統一公共返回類的實現
- springboot框架的全局異常處理方案詳解
- Springboot處理異常的常見方式
- SpringBoot中如何統一接口返回與全局異常處理詳解
- Spring Boot統一處理全局異常的實戰教程