最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot3實現統(tǒng)一結果封裝的示例代碼

 更新時間:2024年03月14日 11:00:34   作者:蒾酒  
Spring Boot進行統(tǒng)一結果封裝的主要目的是提高開發(fā)效率、降低代碼重復率,并且提供一致的API響應格式,從而簡化前后端交互和錯誤處理,所以本文給大家介紹了SpringBoot3實現統(tǒng)一結果封裝的方法,需要的朋友可以參考下

前置條件

已經初始化好一個spring boot項目且版本為3X,項目可正常啟動。

作者版本為3.2.2

初始化教程:

新版idea(2023)創(chuàng)建spring boot3項目

封裝目的

Spring Boot進行統(tǒng)一結果封裝的主要目的是提高開發(fā)效率、降低代碼重復率,并且提供一致的API響應格式,從而簡化前后端交互和錯誤處理

具體好處如下:

  • 方便前端處理:前端可以統(tǒng)一根據返回格式進行處理,而不用關注具體的返回類型和內容。
  • 提高 API 的可讀性和可維護性:統(tǒng)一結果封裝可以使 API 的返回更加規(guī)范化,統(tǒng)一了 API 返回結果的格式,使得代碼更加易于閱讀和維護。
  • 增加系統(tǒng)的健壯性:通過統(tǒng)一結果封裝,能夠更好地處理錯誤和異常情況,從而增加系統(tǒng)的健壯性和穩(wěn)定性。
  • 統(tǒng)一日志輸出:通過統(tǒng)一結果封裝,可以方便地記錄請求參數、請求結果、異常信息等,方便后續(xù)的日志分析和排查問題。

常用格式

最常用的格式為狀態(tài)碼、提示信息、攜帶數據如圖

具體格式還要看團隊,這里我就使用這種通用的格式。

定義返回結果枚舉類

通過使用這樣的枚舉類有助于避免硬編碼的狀態(tài)碼和消息,提高了代碼的可維護性。

import lombok.Getter;
 
/**
 * @author mijiupro
 */
@Getter
public enum ResultEnum {
 
    /* 成功狀態(tài)碼 */
    SUCCESS(1, "操作成功!"),
 
    /* 錯誤狀態(tài)碼 */
    FAIL(0, "操作失敗!"),
 
    /* 參數錯誤:10001-19999 */
    PARAM_IS_INVALID(10001, "參數無效"),
    PARAM_IS_BLANK(10002, "參數為空"),
    PARAM_TYPE_BIND_ERROR(10003, "參數格式錯誤"),
    PARAM_NOT_COMPLETE(10004, "參數缺失"),
 
    /* 用戶錯誤:20001-29999*/
    USER_NOT_LOGGED_IN(20001, "用戶未登錄,請先登錄"),
    USER_LOGIN_ERROR(20002, "賬號不存在或密碼錯誤"),
    USER_ACCOUNT_FORBIDDEN(20003, "賬號已被禁用"),
    USER_NOT_EXIST(20004, "用戶不存在"),
    USER_HAS_EXISTED(20005, "用戶已存在"),
 
    /* 系統(tǒng)錯誤:40001-49999 */
    FILE_MAX_SIZE_OVERFLOW(40003, "上傳尺寸過大"),
    FILE_ACCEPT_NOT_SUPPORT(40004, "上傳文件格式不支持"),
 
    /* 數據錯誤:50001-599999 */
    RESULT_DATA_NONE(50001, "數據未找到"),
    DATA_IS_WRONG(50002, "數據有誤"),
    DATA_ALREADY_EXISTED(50003, "數據已存在"),
    AUTH_CODE_ERROR(50004, "驗證碼錯誤"),
 
 
    /* 權限錯誤:70001-79999 */
    PERMISSION_UNAUTHENTICATED(70001, "此操作需要登陸系統(tǒng)!"),
 
    PERMISSION_UNAUTHORIZED(70002, "權限不足,無權操作!"),
 
    PERMISSION_EXPIRE(70003, "登錄狀態(tài)過期!"),
 
    PERMISSION_TOKEN_EXPIRED(70004, "token已過期"),
 
    PERMISSION_LIMIT(70005, "訪問次數受限制"),
 
    PERMISSION_TOKEN_INVALID(70006, "無效token"),
 
    PERMISSION_SIGNATURE_ERROR(70007, "簽名失敗");
 
    // 狀態(tài)碼
    int code;
    // 提示信息
    String message;
 
    ResultEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }
 
    public int code() {
        return code;
    }
 
    public String message() {
        return message;
    }
 
    public void setCode(int code) {
        this.code = code;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
}

定義返回結果封裝類

import com.mijiu.commom.enumerate.ResultEnum;
import lombok.Data;
 
 
/**
 * @author mijiupro
 */
 
@Data
public class Result<T> {
 
    // 操作代碼
    Integer code;
 
    // 提示信息
    String message;
 
    // 結果數據
    T data;
 
    public Result(ResultEnum resultCode) {
        this.code = resultCode.code();
        this.message = resultCode.message();
    }
 
    public Result(ResultEnum resultCode, T data) {
        this.code = resultCode.code();
        this.message = resultCode.message();
        this.data = data;
    }
    public Result(String message) {
        this.message = message;
    }
    //成功返回封裝-無數據
    public static Result<String> success() {
        return new Result<String>(ResultEnum.SUCCESS);
    }
    //成功返回封裝-帶數據
    public static <T> Result<T> success(T data) {
        return new Result<T>(ResultEnum.SUCCESS, data);
    }
    //失敗返回封裝-使用默認提示信息
    public static Result<String> error() {
        return new Result<String>(ResultEnum.FAIL);
    }
    //失敗返回封裝-使用返回結果枚舉提示信息
    public static Result<String> error(ResultEnum resultCode) {
        return new Result<String>(resultCode);
    }
    //失敗返回封裝-使用自定義提示信息
    public static Result<String> error(String message) {
        return new Result<String>(message);
 
    }
}

對返回結果封裝

此時我們就可以使用封裝類封裝統(tǒng)一格式的響應了

import com.mijiu.common.result.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @author mijiupro
 */
@RestController
@RequestMapping("/test1")
public class Test1Controller {
    @GetMapping("/hello")
    public Result<String> hello() {
        return Result.success("hello world");
    }
}

我們的接口通常有很多,如果對每個接口都封裝屬于重復勞動,可以利用AOP技術攔截控制類的返回結果進行封裝。

代碼如下

import cn.hutool.json.JSONUtil;
import com.mijiu.commom.result.Result;
import io.micrometer.common.lang.NonNullApi;
import io.micrometer.common.lang.Nullable;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
 
/**
 * 統(tǒng)一結果封裝增強器
 * @author mijiupro
 */
@RestControllerAdvice(basePackages = "com.mijiu.controller")//指定要增強的包
@NonNullApi
public class ResultAdvice implements ResponseBodyAdvice<Object> {
 
    /**
     * 判斷是否支持對返回類型的處理
     *
     * @param returnType    方法參數的類型
     * @param converterType 轉換器的類型
     * @return 是否支持處理
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }
 
    /**
     * 在寫入響應體之前對返回結果進行處理和封裝
     *
     * @param body                  返回結果對象
     * @param returnType            方法參數的類型
     * @param selectedContentType   響應內容的類型
     * @param selectedConverterType 轉換器的類型
     * @param request               HTTP 請求對象
     * @param response              HTTP 響應對象
     * @return 處理后的返回結果
     */
    @Override
    public Object beforeBodyWrite(@Nullable Object body, MethodParameter returnType,
                                  MediaType selectedContentType, Class selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        //當返回結果為字符串類型需要單獨處理
        if (body instanceof String) {
            // 如果返回結果是字符串類型,將其封裝為成功的結果對象,并轉換為 JSON 字符串
            return JSONUtil.toJsonStr(Result.success(body));
        }
 
        // 將返回結果封裝為成功的結果對象
        return Result.success(body);
    }
}

此代碼可以兼容任何類型的返回結果對其進行統(tǒng)一封裝。

為何遇到方法的返回結果是String類型需要手動轉成json返回呢?

測試封裝

現在com.mijiu.controller下的所有控制類的所有方法都會被攔截將返回結果進行統(tǒng)一格式封裝。

到這里返回結果統(tǒng)一封裝結束。

以上就是SpringBoot3實現統(tǒng)一結果封裝的示例代碼的詳細內容,更多關于SpringBoot3統(tǒng)一結果封裝的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解feign調用session丟失解決方案

    詳解feign調用session丟失解決方案

    這篇文章主要介紹了詳解feign調用session丟失解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • Spring JDBC參數處理與嵌入式數據庫的實戰(zhàn)指南

    Spring JDBC參數處理與嵌入式數據庫的實戰(zhàn)指南

    這篇文章介紹了Spring Framework中JDBC的支持,包括如何處理參數和數據值、處理BLOB和CLOB、為IN子句傳遞列表以及存儲過程調用中的復雜類型,本文用通俗易懂的方式講解Spring JDBC參數處理與嵌入式數據庫的相關操作,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Eclipse遠程debug的步驟與注意事項

    Eclipse遠程debug的步驟與注意事項

    今天小編就為大家分享一篇關于Eclipse遠程debug的步驟與注意事項,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • java面試LruCache?和?LinkedHashMap及算法實現

    java面試LruCache?和?LinkedHashMap及算法實現

    這篇文章主要為大家介紹了java面試LruCache?和?LinkedHashMap及算法實現示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 淺談spring-boot-rabbitmq動態(tài)管理的方法

    淺談spring-boot-rabbitmq動態(tài)管理的方法

    這篇文章主要介紹了淺談spring-boot-rabbitmq動態(tài)管理的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 云IDE:Eclipse Che:Eclipse下一代IDE(推薦)

    云IDE:Eclipse Che:Eclipse下一代IDE(推薦)

    這篇文章主要介紹了云IDE:Eclipse Che:Eclipse下一代IDE,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • spring mvc+localResizeIMG實現HTML5端圖片壓縮上傳

    spring mvc+localResizeIMG實現HTML5端圖片壓縮上傳

    這篇文章主要為大家詳細介紹了使用spring mvc+localResizeIMG實現HTML5端圖片壓縮上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Spring注解@Qualifier的使用&&與@Primary注解的不同

    Spring注解@Qualifier的使用&&與@Primary注解的不同

    今天帶你了解一下Spring框架中的@Qualifier?注解,它解決了哪些問題,以及如何使用它,我們還將了解它與?@Primary?注解的不同之處,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • springmvc @RequestBody String類型參數的使用

    springmvc @RequestBody String類型參數的使用

    這篇文章主要介紹了springmvc @RequestBody String類型參數的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringSecurity進行認證與授權的示例代碼

    SpringSecurity進行認證與授權的示例代碼

    SpringSecurity是Spring家族中的一個安全管理框架,而認證和授權也是SpringSecurity作為安全框架的核心功能,本文主要介紹了SpringSecurity進行認證與授權的示例代碼,感興趣的可以了解一下
    2024-06-06

最新評論

新津县| 凤山县| 东光县| 密山市| 瓦房店市| 通河县| 霍城县| 民丰县| 丰原市| 红河县| 伊川县| 阜康市| 青岛市| 株洲市| 麻阳| 区。| 开化县| 高雄市| 大庆市| 阜新| 镇平县| 武安市| 武威市| 方正县| 永宁县| 象山县| 综艺| 兴宁市| 隆林| 新余市| 克什克腾旗| 南昌县| 黑龙江省| 普兰店市| 通化市| 宜兰县| 井冈山市| 南岸区| 莱州市| 通州区| 绥江县|