SpringBoot(八) - 統一數據返回,統一分頁工具,統一異常處理

来源:https://www.cnblogs.com/xiaoqigui/archive/2022/10/19/16806486.html
-Advertisement-
Play Games

1、統一數據返回 使用逆向工程來進行測試,實體,mapper等省略; 1.1 直接使用 RequestResoult 1.1.1 RequestResoult 請求結果返回實體 //統一返回 實體 類 @Data public class RequestResult<T> { //狀態碼 priva ...


1、統一數據返回

使用逆向工程來進行測試,實體,mapper等省略;

1.1 直接使用 RequestResoult

1.1.1 RequestResoult 請求結果返回實體

//統一返回 實體 類
@Data
public class RequestResult<T> {

    //狀態碼
    private String code;

    //狀態說明,對code的說明
    private String msg;

    //介面數據
    private T data;

}

1.1.2 service層

1.1.2.1 介面
public interface EdocEntryService {

    //按摘要查詢
    List<EdocEntry> getEdocEntriesBySummary(String summary);
    
}
1.1.2.2 實現類

註意記得在 主啟動類中添加 mapper介面掃描註解 :@MapperScan("com.kgc.sbt.mapper")

@Service
public class EdocEntryServiceImpl implements EdocEntryService {

    @Autowired(required = false)
    private EdocEntryMapper edocEntryMapper;

    @Override
    public List<EdocEntry> getEdocEntriesBySummary(String summary) {

        //使用逆向工程,封裝查詢條件

        EdocEntryExample edocEntryExample = new EdocEntryExample();

        //排序條件
        edocEntryExample.setOrderByClause(" id desc ");

        //根據摘要 模糊查詢
        edocEntryExample.createCriteria().andSummaryLike("%" + summary + "%");

        //調用持久層 查詢數據
        return edocEntryMapper.selectByExample(edocEntryExample);

    }
    
}

1.1.3 測試請求

@Slf4j
@RestController
public class EdocEntryController {

    @Autowired
    private EdocEntryService edocEntrieService;

    //根據電子文檔,查詢文檔列表,直接使用 RequestResult
    @GetMapping("/edocEntries")
    //指定請求返回類型 RequestResult<List<EdocEntry>> 
	//public RequestResult<List<EdocEntry>> edocEntries(@RequestParam(required = false) String summary){ 
    //自適應請求返回類型 RequestResult<?>
    public RequestResult<?> edocEntries(@RequestParam(required = false) String summary){
        
        //調用業務介面,獲取文檔列表,進行統一返回
        //創建統一返回對象
        //每次都需要創建返回對象,代碼冗餘,不利於維護
        RequestResult<List<EdocEntry>> requestResult = new RequestResult<>();
        requestResult.setCode("200");
        requestResult.setMsg("success");
        List<EdocEntry> edocEntriesBySummary = edocEntrieService.getEdocEntriesBySummary(summary);
        log.info("{}",edocEntriesBySummary);
        requestResult.setData(edocEntriesBySummary);
        //介面統一返回查詢結果
        return requestResult;
        
    }

}

測試結果:

1.2 使用 ResultBuildUtil 結果對象構建工具

1.2.1 CommonConstant 常量類

//Description: 系統常量類,統一管理項目中所有的常量
public class CommonConstant {

    /*
     統一返回成功的狀態碼
     */
    public static final String UNIFY_RESULT_SUCCESS_CODE = "200";

    /*
     統一返回成功的信息
     */
    public static final String UNIFY_RESULT_SUCCESS_MSG = "SUCCESS";

    /*
   統一返回錯誤的狀態碼
   */
    public static final String UNIFY_RESULT_FAIL_CODE = "999";

    /*
     統一返回錯誤的信息
     */
    public static final String UNIFY_RESULT_FAIL_MSG = "FAIL";


    /*
        分頁預設頁嗎
     */
    public static final int DEFAULT_INIT_PAGE_NO = 1;

    /*
        分頁預設條數
     */
    public static final int DEFAULT_INIT_PAGE_SIZE = 3;

}

1.2.2 ResultBuildUtil結果對象構建工具列

//Description: 結果構建工具類
public class ResultBuildUtil {

    //構建成功返回,支持任意類型參數
    public static <T> RequestResult<T> success(T t) {
        //創建統一返回成功結果對象
        RequestResult<T> requestResult = new RequestResult<>();

        requestResult.setCode(CommonConstant.UNIFY_RESULT_SUCCESS_CODE);
        requestResult.setMsg(CommonConstant.UNIFY_RESULT_SUCCESS_MSG);
        requestResult.setData(t);

        return requestResult;

    }

    //構建成功返回,空參
    public static <T> RequestResult<T> success() {
        return success(null);
    }

    //構建 失敗返回,支持任意類型參數,用戶不便於歸類的異常錯誤結果返回
    public static <T> RequestResult<T> fail(T t) {
        //創建統一返回失敗結果對象
        RequestResult<T> requestResult = new RequestResult<>();

        requestResult.setCode(CommonConstant.UNIFY_RESULT_FAIL_CODE);
        requestResult.setMsg(CommonConstant.UNIFY_RESULT_FAIL_MSG);
        requestResult.setData(t);

        return requestResult;

    }

    //構建 失敗返回,空參
    public static <T> RequestResult<T> fail() {
        //創建統一返回失敗結果對象
        return fail(null);

    }

    //構建 失敗返回,自定義錯誤碼,和說明,支持任意類型參數
    public static <T> RequestResult<T> fail(String errCode,String errMsg,T t) {
        //創建統一返回失敗結果對象
        RequestResult<T> requestResult = new RequestResult<>();
        requestResult.setCode(errCode);
        requestResult.setMsg(errMsg);
        requestResult.setData(t);
        return requestResult;
    }

    //構建 失敗返回,自定義錯誤碼,和說明,無參
    public static <T> RequestResult<T> fail(String errCode,String errMsg) {
        //創建統一返回 失敗結果對象
        RequestResult<T> requestResult = new RequestResult<>();
        requestResult.setCode(errCode);
        requestResult.setMsg(errMsg);
        return requestResult;
    }

}

1.2.3 service層

service層不變;

1.2.4 請求測試

@Slf4j
@RestController
public class EdocEntryController {

    @Autowired
    private EdocEntryService edocEntrieService;

    //根據電子文檔,查詢文檔列表, 使用結果構建工具
    @GetMapping("/edocEntries")
    public RequestResult<?> edocEntries(@RequestParam(required = false) String summary){

        //使用結果構建工具,返回成功的結果
        return ResultBuildUtil.success(edocEntrieService.getEdocEntriesBySummary(summary));

    }

}

測試結果:

2、統一分頁工具

2.1 PageSupport 統一分頁工具類

// 分頁 結果返回類
@Data
public class  PageSupport<T> {

    //當前頁碼
    private int pageNo;

    //頁麵條數
    private int pageSize;

   //總條數
    private int totalCount;

    //總頁數
    private int totalPage;

    //分頁數據
    private Collection<T> PageData;

    //當總條數確定時,總條數確定
    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;

        totalPage = totalCount % this.pageSize == 0
                ? totalCount / this.pageSize
                : totalCount / this.pageSize + 1;

    }

}

2.2 service 層

2.2.1 介面

public interface EdocEntryService {

    //條件分頁查詢
    PageSupport<EdocEntry> getEdocEntriesBySummary(String summary,Integer pageNo,Integer pageSize);
    
}

2.2.2 實現類

@Service
public class EdocEntryServiceImpl implements EdocEntryService {

    @Override
    public PageSupport<EdocEntry> getEdocEntriesBySummary(String summary, Integer pageNo, Integer pageSize) {

        //創建統一返回分頁對象
        PageSupport<EdocEntry> pageSupport = new PageSupport<>();

        //設置分頁參數
        pageSupport.setPageNo(pageNo < 1 ? CommonConstant.DEFAULT_INIT_PAGE_NO : pageNo);
        pageSupport.setPageSize(pageNo < 3 ? CommonConstant.DEFAULT_INIT_PAGE_SIZE : pageSize);

        //封裝查詢條件
        EdocEntryExample edocEntryExample = new EdocEntryExample();

        //排序條件
        edocEntryExample.setOrderByClause(" id desc ");

        //根據摘要 模糊查詢
        edocEntryExample.createCriteria().andSummaryLike("%" + summary + "%");

        // 查詢滿足條件總條數
        pageSupport.setTotalCount((int) edocEntryMapper.countByExample(edocEntryExample));

        //增加分頁參數
        edocEntryExample.setOffset((long)(pageSupport.getPageNo()-1)*pageSupport.getPageSize());
        edocEntryExample.setLimit(pageSupport.getPageSize());

        //增加分頁數據
        pageSupport.setPageData(edocEntryMapper.selectByExample(edocEntryExample));

        //返回分頁對象
        return pageSupport;
    }
  
}

2.3 commons-lang中 isEmpty 方法和idBlank區別

2.3.1 依賴

<!-- commons-lang start -->
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>
<!-- commons-lang end -->

2.3.2 isEmpty 方法和idBlank區別

isEmpty 和 isBlank ,isEmpty 方法和idBlank區別:只包含空格字元串判斷,isEmpty是false,isBlank是true;
2.3.2.1 isEmpty
* <pre>
* StringUtils.isEmpty(null)      = true
* StringUtils.isEmpty("")        = true
* StringUtils.isEmpty(" ")       = false
* StringUtils.isEmpty("bob")     = false
* StringUtils.isEmpty("  bob  ") = false
* </pre>
2.3.2.2 isBlank
* <pre>
* StringUtils.isBlank(null)      = true
* StringUtils.isBlank("")        = true
* StringUtils.isBlank(" ")       = true
* StringUtils.isBlank("bob")     = false
* StringUtils.isBlank("  bob  ") = false
* </pre>

2.4 測試請求

//根據電子文檔,查詢文檔列表
@GetMapping("/edocEntriesPage")
public RequestResult<?> edocEntriesPage(@RequestParam(value = "summary",required = false) String summary,
                                        @RequestParam(value = "pageNo",defaultValue = "1") Integer pageNo,
                                        @RequestParam(value = "pageSize",defaultValue = "3") Integer pageSize){

    if(StringUtils.isBlank(summary)){
        return ResultBuildUtil.fail();
    }

    //調用業務介面,獲取文檔列表,進行統一返回
    //使用結果構建工具,返回成功的結果
    return ResultBuildUtil.success(edocEntrieService.getEdocEntriesBySummary(summary,pageNo,pageSize));
    
}

測試結果:

2.5 commons-lang3 生成6位隨機數

2.5.1 依賴

<!-- commons-lang3 start -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>
<!-- commons-lang3 end -->

2.5.2 代碼

String code = RandomStringUtils.randomNumeric(6);

3、統一異常處理

3.1 EdocExceptionEnum 自定義異常枚舉

//自定義異常枚舉
public enum EdocExceptionEnum {

    /**
     * 參數為空
     */
    EDOC_REQUEST_PARAM_EMPTY("201", "參數為空"),

    /**
     * 參數為非法
     */
    EDOC_REQUEST_PARAM_ILLEGAL("202", "參數非法"),

    /**
     * 網路異常
     */
    EDOC_NETWORK_ERROR("301", "網路異常"),

    /**
     * 資料庫異常
     */
    EDOC_DATABASE_ERROR("401", "資料庫異常"),

    /**
     * 資料庫異常
     */
    EDOC_SYSTEM_ERROR("501", "系統異常");

    /**
     * 異常碼
     */
    private String errCode;

    /**
     * 異常說明
     */
    private String errMsg;

    /**
     * 提供帶有兩個參數的構造方法
     */
    EdocExceptionEnum(String errCode, String errMsg){
        this.errCode = errCode;
        this.errMsg = errMsg;
    }

    public String getErrCode() {
        return errCode;
    }

    public String getErrMsg() {
        return errMsg;
    }

}

3.2 EdocException 自定義異常類

public class EdocException extends RuntimeException{

    /*
        異常枚舉類型全局私有屬性
    */
    private EdocExceptionEnum edocExceptionEnum;

    //繼承 RuntimeException  生成所有的構造方法
    public EdocException() {
    }

    public EdocException(String message) {
        super(message);
    }

    public EdocException(String message, Throwable cause) {
        super(message, cause);
    }

    public EdocException(Throwable cause) {
        super(cause);
    }

    public EdocException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }

    //自定義枚舉異常構造函數
    public EdocException(EdocExceptionEnum edocExceptionEnum){
        this.edocExceptionEnum = edocExceptionEnum;
    }

    //獲取枚舉異常屬性
    public EdocExceptionEnum getEdocExceptionEnum() {
        return edocExceptionEnum;
    }
}

3.3 EdocExceptionHandler 自定義異常統一處理類

//自定義異常統一處理類
@ControllerAdvice
public class EdocExceptionHandler {

    /**
     * @author : huayu
     * @date   : 19/10/2022
     * @param  : [edocException]
     * @return : requestResoult<?>
     * @description : 系統自定義異常處理,對系統中所有拋出自定義的異常,都會進行統一攔截處理,實現統一返回
     */
    @ExceptionHandler(EdocException.class)  //指定對該自定義異常類 進行處理
    @ResponseBody  //指定返回的數據 為 json類型
    public RequestResult<?> handleEdocException(EdocException edocException){
        //統一返回失敗的結果(前提:拋出的必須是帶枚舉類型的異常)
        return ResultBuildUtil.fail(edocException.getEdocExceptionEnum().getErrCode(),edocException.getEdocExceptionEnum().getErrMsg());

    }

}

3.4 請求測試

@GetMapping("/edocEntriesPage")
public RequestResult<?> edocEntriesPage(@RequestParam(value = "summary",required = false) String summary,
                                        @RequestParam(value = "pageNo",defaultValue = "1") Integer pageNo,
                                        @RequestParam(value = "pageSize",defaultValue = "3") Integer pageSize){

	//判斷 summary參數是否為空
    if(StringUtils.isBlank(summary)){
        //拋出自定義異常:使用異常枚舉
        throw new EdocException(EdocExceptionEnum.EDOC_REQUEST_PARAM_EMPTY);
    }

    ////拋出自定義異常:使用異常枚舉
    try {
        return ResultBuildUtil.success(edocEntrieService.getEdocEntriesBySummary(summary,pageNo,pageSize));
    } catch (Exception e) {
        //e.printStackTrace();
         //拋出自定義異常:使用異常枚舉
        throw new EdocException(EdocExceptionEnum.EDOC_DATABASE_ERROR);
    }

}

測試請求參數為空:

測試資料庫密碼錯誤:





您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當我們在演示文稿中添加商標、版權或其他符號時,我們可能希望該符號出現在某個文本的上方或下方。在Microsoft PowerPoint中,我們可以通過對符號應用上標或下標格式來實現這種效果。 ...
  • 前言 大家早好、午好、晚好吖~ 環境使用: Python 3.8 Pycharm 安裝python第三方模塊: win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車 在pycharm中點擊Terminal(終端) ...
  • 今天來實踐一下如何用Python對商品庫存繪製餅狀圖進行分析 一、知識點 文件讀寫 基礎語法 字元串處理 文件生成 數據構建 二、效果展示 一目瞭然 三、代碼展示 兄弟們學習python,有時候不知道怎麼學,從哪裡開始學。掌握了基本的一些語法或者做了兩個案例後,不知道下一步怎麼走,不知道如何去學習更 ...
  • 在python中沒有直接針對文件夾的操作方法,可以藉助模塊os,os.path和shutil來操作。在新建文件夾時可以創建一級文件,也可以創建多級文件。 判斷文件夾或者文件是否存在 判斷文件或者文件夾是否存在,可以使用os.path.exists()函數來判斷,其使用方法如下 os.path.exi ...
  • 1.題目名稱:批閱奏章某朝皇帝有大臣n名(1<=n<=1000),分別編號大臣1~n。某日皇帝身體抱恙,奏章堆積如山無法及時一一批閱,便命身旁內侍幫他把奏章按指定順序排序後再閱。於是皇帝親自挑選了幾個值得信賴的重臣併排好序,要求把他們的奏章按排好的順序放到前面,其他的按照編號升序排列即可。現在要求你 ...
  • 在某些情況下,你可能需要在Microsoft Word中插入上標和下標。例如,當你正在創建一個涉及科學公式的學術文件時。 ...
  • 在進行滲透過程中,也可以藉助一些商用或者非商業平臺來進行信息搜索及驗證,主要針對郵箱、IP、功能變數名稱、文件md5、apk文件等進行搜索,整理和完善線索信息。為了大家方便, 對目前公開的威脅情報平臺進行搜集,在實際使用過程中建議交叉搜索,以獲得更多的信息。這些平臺都需要實名認證,認證後即可進行查詢。 一、 ...
  • 1 設計模式概述 ​ 軟體設計模式(Software Design Pattern),俗稱設計模式,設計模式是一套被反覆使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。它描述了在軟體設計過程中的一些不斷重覆發生的問題,以及該問題的解決方案。也就是說,它是解決特定問題的一系列套路,是前輩們的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...