亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺析SpringBoot統(tǒng)一返回結果的實現

 更新時間:2023年07月31日 15:42:59   作者:爪哇程序人生  
前后端開發(fā)過程中數據交互規(guī)范化是一件非常重要的事情,不僅可以減少前后端交互過程中出現的問題,也讓代碼邏輯更加具有條理,下面小編就和大家講講SpringBoot如何統(tǒng)一返回結果的吧

開發(fā)背景

現如今前后端分離已經是項目開發(fā)的主流方式,在前后端分離開發(fā)情形下,少不了前端和后端之間的友好交流,為了避免上升為物理交流,項目中必須要有一套規(guī)范有效的前后端協(xié)議格式。

后端開發(fā)的不同服務、不同業(yè)務處理并返回不同類型的數據,這不僅會增加巨大工作量來進行協(xié)議的輸出,數據格式的多樣化對于前端同事來講也是一個災難,這就需要對后端服務接口的返回格式定義成統(tǒng)一規(guī)范的結果類型。

前后端開發(fā)過程中數據交互規(guī)范化是一件非常重要的事情,不僅可以減少前后端交互過程中出現的問題,也讓代碼邏輯更加具有條理。

初始篇:從封裝返回結果說起

返回結果類基本特征

對于后端的返回數據,考慮將格式統(tǒng)一后返回,在開發(fā)大量后端服務接口之后,根據開發(fā)經驗可以總結得到,請求一個接口時需要關注的指標有:

  • 響應狀態(tài)碼,即請求接口返回狀態(tài)碼,如 HTTP 請求中的 200、304、500 等狀態(tài)
  • 響應結果描述,有些接口請求成功或失敗需要返回描述信息供前端展示
  • 響應結果數據,大部分的接口都會返回后端獲取的數據,并以列表的形式展示的前端頁面中
  • 是否成功:在實際項目中請求接口時,首先要關注的應該是接口的請求是否成功,然后才會去關注成功返回數據或者錯誤代碼和信息,在統(tǒng)一數據中可以加入請求是否成功的標識,當然接口的成功與否也可以根據狀態(tài)碼可以判斷,可以根據實際需求考慮是否定義結果狀態(tài)
  • 其他標識:為了顯示更多接口調用的信息,可能會根據實際的業(yè)務需求加入接口調用的時間信息等。

除了以上屬性特征外,返回結果類在定義時還應該滿足:

  • 屬性私有化,使用 get/set 方法來操作屬性值
  • 構造器私有化,外部只可以調用方法,初始化要在類內部完成
  • 由于外部需要直接調用方法,因此方法要定義為靜態(tài)方法

松散的自定義返回結果

根據上述對返回結果基本特征的分析,我們可以定義一個如下代碼所示為的返回結果類

public class Result {
    private Integer code;
    private String desc;
    private Object data;
    // 是否請求成功,本文使用 code = 10000 特指成功,其余為失敗,因此不再冗余 success
    // private Boolean success;
    //請求時間,暫時不需要,可根據需求定義
    //private long timestamp;
    //構造器私有
    private Result() {}
    //get/set 方法
    public Boolean getSuccess() {
        return success;
    }
    public void setSuccess(Boolean success) {
        this.success = success;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
    /**
     * 返回通用成功
     * @return Result
     */
    public static Result ok(){
        Result result = new Result();
        result.setSuccess(true);
        result.setCode("20000");
        result.setDesc("請求成功");
        return result;
    }
    /**
     * 返回通用失敗,未知錯誤
     * @return Result
     */
    public static Result error(){
        Result result = new Result();
        result.setSuccess(false);
        result.setCode(20001);
        result.setDesc("請求失敗");
        return result;
    }
}

lombok:代碼簡潔利器

為了減少 get/set 等代碼內容,引入了 lombok 工具,并使用注解 @Data 標注,代表當前類默認生成 set/get 方法

@Data
public class Result {
    private Integer code;
    private String desc;
    private Object data;
    private Result() {}
    /**
     * 返回通用成功
     * @return Result
     */
    public static Result ok(){
        Result result = new Result();
        result.setCode("20000");
        result.setDesc("請求成功");
        return result;
    }
    /**
     * 返回通用失敗,未知錯誤
     * @return Result
     */
    public static Result error(){
        Result result = new Result();
        result.setCode(20001);
        result.setDesc("請求失敗");
        return result;
    }
}

結果類使用方法

定義返回結果類后,Controller 對應的服務方法中就可以使用其作為返回結果類型,如下

@PostMapping("get")
public String getInfo(){
    // 處理邏輯在這里
    String result = "返回結構或";
    // 封裝返回結果
    Result result = Result.ok();
    result.setData(result);
    return result;
}

進階篇:枚舉錯誤類和鏈式返回來加盟

實際面臨的小問題

上述返回結果定義內容,盡管滿足了基本需求,但是在使用時仍存在著如下的問題

  • 返回結果需要先初始化,然后再進行結果賦值處理,相當于返回值仍需要手動添加,這樣即增加了數據錯誤的風險,并且并沒有減少實際代碼量,不能凸顯統(tǒng)一封裝帶來的好處。
  • 上述封裝類中,分別定義了返回成功和失敗的靜態(tài)方法,但是對于失敗的結果可能是多樣的,不可能針對每種失敗分別定義對應的靜態(tài)方法,這樣即繁瑣又不現實。

為了解決上述問題,對現有的結果類進行優(yōu)化處理,采用方法有

  • 使用返回對象本身的方式來簡化對象初始化和賦值步驟,簡潔代碼,突出重點
  • 采用返回結果枚舉類的方式將所有可能返回的結果定義為枚舉類常量,在返回結果類中使用對應的枚舉類返回創(chuàng)建,以此處理異常結果多樣性問題

定義返回結果枚舉類

首先定義返回結果枚舉類,枚舉類的使用可以進一步規(guī)范返回結果類中定義的屬性取值。

@Getter
public enum ResultCodeEnum {
    SUCCESS(20000,"響應成功"),
    UNKNOWN_ERROR(20001,"未知錯誤"),
    PARAM_ERROR(20002,"參數錯誤"),
    NULL_POINT_ERROR(20003,"空指針異常"),
    HTTP_CLIENT_ERROR(20003,"客戶端連接異常");
    /**
     * 響應狀態(tài)碼
     */
    private Integer code;
    /**
     * 響應描述信息
     */
    private String desc;
    ResultCodeEnum(Integer code, String desc){
        this.code = code;
        this.desc = desc;
    }
}

@Getter 注解也是 lombok 提供的注解,代表為當前類屬性僅生成 get 方法,枚舉類不需要 set 方法,屬性賦值通過定義枚舉對象或者構造方法實現。

狀態(tài)枚舉以及鏈式返回實現

實現鏈式返回需要定義屬性的 set 方法返回結果類型為當前結果類,并在方法中返回對象本身 this 。

@Data
public class Result {
    private Integer code;
    private String desc;
    private Object data;
    private Result() {}
    /**
     * 使用枚舉類設置返回結果
     * @param resultCodeEnum
     * @return
     */
    public static Result setResult(ResultCodeEnum resultCodeEnum){
        Result result = new Result();
        result.setCode(resultCodeEnum.getCode());
        result.setDesc(resultCodeEnum.getDesc());
        return result;
    }
     /**
     * 返回通用成功
     * @return Result
     */
    public static Result ok(){
        // 鏈式處理
        return new Result().setResult(ResultCodeEnum.SUCCESS);
    }
    /**
     * 返回通用失敗,未知錯誤
     * @return Result
     */
    public static Result error(){
        // 鏈式處理
        return new Result().setResult(ResultCodeEnum.UNKNOWN_ERROR);
    }
    /**
     * 返回結果類,使用鏈式編程
     * 自定義成功標識
     * @param 
     * @return
     */
     public Result setSuccess(Boolen success){
        this.setSuccess(success);
        return this;
    }
    /**
     * 返回結果類,使用鏈式編程
     * 自定義狀態(tài)碼
     * @param 
     * @return
     */
     public Result setCode(Integer code){
        this.setCode(code);
        return this;
    }
    /**
     * 返回結果類,使用鏈式編程
     * 自定義返回結果描述
     * @param 
     * @return
     */
     public Result setDesc(String desc){
        this.setDesc(desc);
        return this;
    }
    /**
     * 返回結果類,使用鏈式編程
     * 自定義結果數據
     * @param 
     * @return
     */
     public Result setData(Object data){
        this.setData(data);
        return this;
    }
}

lombok:我又來了

對于鏈式返回的處理 lombok 也提供了一個 @Accessors(chain = true) 代表為 set 方法實現鏈式返回結構,使用注解實現如下

@Data
@Accessors(chain = true)
public class Result {
    private Integer code;
    private String desc;
    private Object data;
    private Result() {}
    /**
     * 使用枚舉類設置返回結果
     * @param resultCodeEnum
     * @return
     */
    public static Result setResult(ResultCodeEnum resultCodeEnum){
        Result result = new Result();
        result.setCode(resultCodeEnum.getCode());
        result.setDesc(resultCodeEnum.getDesc());
        return result;
    }
     /**
     * 返回通用成功
     * @return Result
     */
    public static Result ok(){
        return new Result().setResult(ResultCodeEnum.SUCCESS);
    }
    /**
     * 返回通用失敗,未知錯誤
     * @return Result
     */
    public static Result error(){
        return new Result().setResult(ResultCodeEnum.UNKNOWN_ERROR);
    }
}

如上,整個返回結果類定義已經比較精簡,通過 @Data 和 @Accessors(chain = true) 注解實現了get/set 方法和鏈式返回,并定義了通過枚舉類創(chuàng)建對象的方法,并提供了直接返回的成功和失敗方法。

結果類使用展示

@PostMapping("get")
public String getInfo(){
    // 處理邏輯在這里
    String result = "返回結構或";
    // 封裝返回結果,使用默認成功結果
    // return Result.ok().setData(result);
    // 封裝返回結果,使用默認失敗結果
    // return Result.error();
    // 封裝返回結果,使用自定義枚舉類
    return Result.setResult(ResultCodeEnum.NULL_POINT_ERROR);
}

最終篇:建造者模式有話說

進階之后的返回結果類已經很簡潔,并且使用也比較方便,已經是一個完整的結果類了,可以滿足大部分場景下的使用。

但是,對于代碼開發(fā)來講,就是要不斷優(yōu)化我們的代碼結構,使之無論從看起來、還是用起來、以及講起來都要更加的合理且優(yōu)雅,那么這個時候,設計模式就有話說了。

在進階篇中,我們使用了結果枚舉 + 鏈式返回,已經有了建造者模式的影子了,結果枚舉就類似于建造者對象的簡陋版,鏈式返回在建造者對象屬性賦值中也有使用。

接下來看一下使用建造者模式來實現返回結果類的方法

建造者和結果對象,相親相愛一家人

標準的建造者模式認為,需要定義抽象接口來定義建造者的行為,并實現類來與目標對象關聯。

為了方便及展示其密切關聯性,我們實現一個簡化版的建造者模式,并將建造者對象作為結果對象的內部靜態(tài)類實現。

public class Result {
    private String code;
    private String desc;
    private Object data;
    private Result(ResultBuilder resultBuilder) {
        this.code = resultBuilder.code;
        this.desc = resultBuilder.desc;
        this.data = resultBuilder.data;
    }
    // 定義靜態(tài)方法創(chuàng)建 ResultBuilder 類,否則使用時需要 new Result.ResultBuilder() 
    public static ResultBuilder builder(){
        return new ResultBuilder();
    }
    public static class ResultBuilder{
        private String code;
        private String desc;
        private T data;
        public ResultBuilder code(String code) {
            this.code = code;
            return this;
        }
        public ResultBuilder desc(String desc) {
            this.desc = desc;
            return this;
        }
        public ResultBuilder data(Object data) {
            this.data = data;
            return this;
        }
        public ResultBuilder resultCodeEnum(ResultCodeEnum resultCodeEnum){
            this.success = resultCodeEnum.getSuccess();
            this.code = resultCodeEnum.getCode();
            this.desc = resultCodeEnum.getDesc();
            return this;
        }
        public Result build(){
            Objects.requireNonNull(this.success);
            return new Result(this);
        }
        public Result successBuild(){
            return this.resultCodeEnum(ResultCodeEnum.SUCCESS).build();
        }
        public Result errorBuild(){
            return this.resultCodeEnum(ResultCodeEnum.UNKNOWN_ERROR).build();
        }
    }
}

使用建造者模式實現返回結果類,可以避免直接對返回結果類屬性的修改,而是通過定義的建造者對象 builder 來賦值,保證了結果對象的數據安全。

內部靜態(tài)建造者類使用

對于內部靜態(tài)類創(chuàng)建時,需要攜帶其外部類名稱才可以使用,如

Result result = new Result.ResultBuilder().data("result").build();

為了實際使用方便,可以在外部類中定義靜態(tài)方法進行 builder 對象的創(chuàng)建,即 builder() 方法

// 使用時創(chuàng)建方法:Result.builder() 
public static ResultBuilder builder(){
    return new ResultBuilder();
}

此時創(chuàng)建方法可以寫成

Result result = Result.builder().data("result").build();

是不是很熟悉!在許多優(yōu)秀的框架使用過程中,重要對象的創(chuàng)建方式就是類似上述的建造者鏈式創(chuàng)建方式。

lombok: 繼續(xù)上分

對于建造者模式的實現,lombok 也提供了實現方案,可以通過 @Builder 注解為類實現內部靜態(tài)的建造者類,與上述代碼基本一致,展現代碼可以更簡潔。

@Builder
public class Result {
    private String code;
    private String desc;
    private Object data;
}

太簡單了有木有!

@Builder 注解實現的建造者模式是最基本的形式,使用時需要注意

  • @Builder 注解只會為 Result 類定義全參數構造方法供 buidler 使用,沒有無參構造,如果需要要自己實現或使用 @AllArgsConstructor 和 @NoArgsConstructor 注解
  • 上述代碼中沒有使用 @Data 注解,Result 對象的屬性不可修改,可以通過屬性名稱獲取,如需要可以自行添加
  • @Builder 注解實現的建造者模式雖然簡單,但是太簡單,無法使用我們進階篇提到的枚舉結果來實現返回對象,因此需要手動實現對應創(chuàng)建方法

實際使用過程中,可以根據需要選擇或定義適合的返回結果類

接口數據格式一覽

定義好返回結果枚舉類和最終的返回結果類后,在 controller 控制器中創(chuàng)建一個接口并返回統(tǒng)一結果類信息

@PostMapping("get")
public String getInfo(){
    // 處理邏輯在這里
    String result = "返回結果";
    // 封裝返回結果
    return Result.builder().data(result).build();
}

通過 http 請求接口,可以得到如下格式的返回結果:

{
  "code": 20000,
  "desc": "查詢成功",
  "data": "返回結果";
}

這樣,一個統(tǒng)一的結果返回類就創(chuàng)建成功了,在項目的開發(fā)過程中可以使用自定義的統(tǒng)一返回結果,如果使用了枚舉類,只需要將返回結果枚舉類維護起來,使用非常的方便哦。

最后

通過逐步的功能豐富,實現了一個滿足基本使用需求的封裝結果類,對項目開發(fā)過程會提供很大的幫助,提升編碼效率并規(guī)范代碼格式,并樹立正確規(guī)范的代碼觀,希望每一位 coder 都能成長為參天大樹,為行業(yè)添磚加瓦。

到此這篇關于淺析SpringBoot統(tǒng)一返回結果的實現的文章就介紹到這了,更多相關SpringBoot統(tǒng)一返回結果內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot中JSONObject遍歷并替換部分json值

    springboot中JSONObject遍歷并替換部分json值

    這篇文章主要介紹了springboot中JSONObject遍歷并替換部分json值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • VsCode配置java環(huán)境的詳細圖文教程

    VsCode配置java環(huán)境的詳細圖文教程

    vscode是一個免費的代碼編輯器,支持多種主題,應用起來簡單方便,下面這篇文章主要給大家介紹了關于VsCode配置java環(huán)境的詳細圖文教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 基于Beanutils.copyProperties()的用法及重寫提高效率

    基于Beanutils.copyProperties()的用法及重寫提高效率

    這篇文章主要介紹了Beanutils.copyProperties( )的用法及重寫提高效率的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java通俗易懂系列設計模式之建造者模式

    Java通俗易懂系列設計模式之建造者模式

    這篇文章主要介紹了Java通俗易懂系列設計模式之建造者模式,對設計模式感興趣的讀者,一定要看一下
    2021-04-04
  • Java 簡化正則表達式的使用

    Java 簡化正則表達式的使用

    本篇文章主要介紹了Java 簡化正則表達式使用的相關知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • SpringBoot集成ElasticSearch的示例代碼

    SpringBoot集成ElasticSearch的示例代碼

    Elasticsearch是用Java語言開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級搜索引擎,本文給大家介紹SpringBoot集成ElasticSearch的示例代碼,感興趣的朋友一起看看吧
    2022-02-02
  • 解析JAVA深度克隆與淺度克隆的區(qū)別詳解

    解析JAVA深度克隆與淺度克隆的區(qū)別詳解

    本篇文章是對JAVA深度克隆與淺度克隆的區(qū)別進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Java Swing實現坦克大戰(zhàn)游戲

    Java Swing實現坦克大戰(zhàn)游戲

    這篇文章主要介紹了Java Swing實現坦克大戰(zhàn)游戲,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很大的幫助喲,需要的朋友可以參考下
    2021-05-05
  • 詳解使用Spring的restTemplete進行Http請求

    詳解使用Spring的restTemplete進行Http請求

    本篇文章主要介紹了詳解使用Spring的restTemplete進行Http請求,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 利用SpringBoot和LiteFlow解鎖復雜流程

    利用SpringBoot和LiteFlow解鎖復雜流程

    隨著業(yè)務的復雜化,企業(yè)需要更加高效、便捷地管理自己的業(yè)務流程,這就需要借助一些流程引擎實現,今天,我們就來介紹一種基于Java語言開發(fā)的輕量級工作流引擎——LiteFlow,以及如何在Spring Boot框架中集成它,從而提高企業(yè)的工作效率和開發(fā)效率
    2023-06-06

最新評論