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

SpringBoot中Pageable分頁參數(shù)的自動提取與全局復用

 更新時間:2026年02月05日 08:42:15   作者:大尚來也  
在現(xiàn)代 Web 應用開發(fā)中,分頁是處理大量數(shù)據(jù)的標配功能,本文將帶你實現(xiàn) 分頁參數(shù)的自動提取、自定義配置與全局復用,感興趣的小伙伴可以跟隨小編一起學習一下

在現(xiàn)代 Web 應用開發(fā)中,分頁是處理大量數(shù)據(jù)的標配功能。Spring Boot 通過 Spring Data 提供了強大的分頁支持——只需在 Controller 方法中聲明 Pageable 參數(shù),框架便能自動從請求中解析 page、sizesort 等參數(shù)并構建分頁對象。然而,在真實項目中,我們常面臨兩個痛點:

  • 默認分頁參數(shù)不符合業(yè)務需求(如 page 從 0 開始 vs 用戶習慣從 1 開始)
  • 分頁邏輯重復散落在多個接口中,難以統(tǒng)一維護

本文將帶你實現(xiàn) 分頁參數(shù)的自動提取、自定義配置與全局復用,讓分頁邏輯既靈活又 DRY(Don’t Repeat Yourself)。

一、Spring Boot 默認分頁機制回顧

Spring Data 提供了 Pageable 接口(通常由 PageRequest 實現(xiàn)),配合 @EnableSpringDataWebSupport(Spring Boot 2.x+ 默認啟用),可直接在 Controller 中使用:

@GetMapping("/users")
public Page<User> getUsers(Pageable pageable) {
    return userService.findAll(pageable);
}

前端請求示例:

GET /users?page=0&size=10&sort=name,asc

注意:page 默認從 0 開始,這常與前端“第1頁”的認知沖突。

二、痛點:為什么需要自定義?

  • 前端希望 page=1 表示第一頁
  • 需要限制最大分頁大小(防刷)
  • 統(tǒng)一分頁響應格式(如包含 totalElements、totalPages 等)
  • 多個模塊重復寫分頁邏輯,難以統(tǒng)一調整

三、解決方案:自定義 Pageable 解析器

步驟 1:配置 Spring 的 Pageable 處理策略

在配置類中,通過 PageableHandlerMethodArgumentResolverCustomizer 自定義默認行為:

@Configuration
public class WebConfig {

    @Bean
    public PageableHandlerMethodArgumentResolverCustomizer pageableCustomizer() {
        return resolver -> {
            resolver.setOneIndexedParameters(true); // 啟用 page=1 表示第一頁
            resolver.setMaxPageSize(100);           // 限制最大每頁條數(shù)
            resolver.setFallbackPageable(PageRequest.of(0, 20)); // 默認分頁
        };
    }
}

效果:所有 Controller 中的 Pageable 參數(shù)自動按新規(guī)則解析!

步驟 2:統(tǒng)一封裝分頁響應(可選但推薦)

創(chuàng)建通用分頁結果類,避免每次手動組裝:

public class PageResult<T> {
    private List<T> content;
    private long totalElements;
    private int totalPages;
    private int pageNumber; // 1-based
    private int pageSize;

    // 構造方法 + getter/setter
    public static <T> PageResult<T> of(Page<T> page) {
        PageResult<T> result = new PageResult<>();
        result.content = page.getContent();
        result.totalElements = page.getTotalElements();
        result.totalPages = page.getTotalPages();
        result.pageNumber = page.getNumber() + 1; // 轉為 1-based
        result.pageSize = page.getSize();
        return result;
    }
}

Controller 使用示例:

@GetMapping("/users")
public PageResult<User> getUsers(Pageable pageable) {
    Page<User> page = userService.findAll(pageable);
    return PageResult.of(page);
}

四、進階:自定義分頁 DTO(適用于復雜場景)

若需額外分頁參數(shù)(如搜索關鍵詞、狀態(tài)過濾等),可封裝專用 DTO:

public class UserQuery {
    private String keyword;
    private String status;
    // 分頁參數(shù)通過繼承或組合 Pageable 獲取
    private Pageable pageable;

    // 或者手動解析
    private Integer page = 1;
    private Integer size = 20;

    public Pageable toPageable() {
        return PageRequest.of(
            Math.max(0, page - 1), 
            Math.min(size, 100),
            Sort.by("createTime").descending()
        );
    }
}

然后在 Controller 中使用 @ModelAttribute 或手動綁定:

@GetMapping("/users")
public PageResult<User> getUsers(UserQuery query) {
    Page<User> page = userService.search(query.getKeyword(), query.getStatus(), query.toPageable());
    return PageResult.of(page);
}

提示:可通過 @InitBinder 或自定義 Converter 實現(xiàn)自動轉換。

五、全局異常處理:攔截非法分頁參數(shù)

結合 @ControllerAdvice,對超出范圍的分頁請求友好提示:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception e) {
        if (e instanceof IllegalArgumentException && e.getMessage().contains("Page index")) {
            return ResponseEntity.badRequest().body(new ErrorResponse("無效的頁碼"));
        }
        // 其他異常處理...
    }
}

六、總結

通過合理利用 Spring Boot 的擴展點,我們可以:

  • 將分頁參數(shù)解析規(guī)則 集中配置
  • 統(tǒng)一前后端分頁語義(1-based)
  • 限制資源濫用(maxPageSize)
  • 封裝通用響應結構,提升代碼一致性

真正的工程優(yōu)雅,不在于炫技,而在于把重復的問題一次性解決干凈。 下次當你再寫分頁接口時,不妨試試這套方案——讓你的代碼更簡潔,團隊協(xié)作更順暢。

到此這篇關于SpringBoot中Pageable分頁參數(shù)的自動提取與全局復用的文章就介紹到這了,更多相關SpringBoot分頁參數(shù)提取內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)單鏈表翻轉實例代碼

    Java實現(xiàn)單鏈表翻轉實例代碼

    Java實現(xiàn)單鏈表反轉,遞歸和非遞歸兩種形式。接下來通過本文給大家分享Java實現(xiàn)單鏈表翻轉實例代碼,需要的的朋友參考下
    2017-03-03
  • Spring Cloud入門系列服務提供者總結

    Spring Cloud入門系列服務提供者總結

    這篇文章主要介紹了Spring Cloud入門系列之服務提供者總結,服務提供者使用Eureka Client組件創(chuàng)建 ,創(chuàng)建完成以后修改某文件,具體操作方法及實例代碼跟隨小編一起看看吧
    2021-06-06
  • Java寫哈希表的完整實例代碼

    Java寫哈希表的完整實例代碼

    Java中的哈希表是數(shù)據(jù)結構中的一個重要組成部分,用于高效存儲和查找數(shù)據(jù),這篇文章主要介紹了Java寫哈希表的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-03-03
  • SpringBoot對靜態(tài)資源的映射規(guī)則詳解解讀

    SpringBoot對靜態(tài)資源的映射規(guī)則詳解解讀

    這篇文章主要介紹了SpringBoot對靜態(tài)資源的映射規(guī)則詳解解讀,在Spring Boot中,映射規(guī)則是用來定義URL與控制器方法之間的映射關系的,通過映射規(guī)則,可以將特定的URL請求映射到相應的控制器方法上,從而實現(xiàn)請求的處理和響應的返回,需要的朋友可以參考下
    2023-10-10
  • Kotlin 開發(fā)環(huán)境詳解及簡單實例

    Kotlin 開發(fā)環(huán)境詳解及簡單實例

    這篇文章主要介紹了 Kotlin 開發(fā)環(huán)境詳解及簡單實例的相關資料,需要的朋友可以參考下
    2017-06-06
  • Java自帶定時任務ScheduledThreadPoolExecutor實現(xiàn)定時器和延時加載功能

    Java自帶定時任務ScheduledThreadPoolExecutor實現(xiàn)定時器和延時加載功能

    今天小編就為大家分享一篇關于Java自帶定時任務ScheduledThreadPoolExecutor實現(xiàn)定時器和延時加載功能,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Spring Boot JPA如何把ORM統(tǒng)一起來

    Spring Boot JPA如何把ORM統(tǒng)一起來

    Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規(guī)范的基礎上封裝的一套JPA應用框架,可使開發(fā)者用極簡的代碼即可實現(xiàn)對數(shù)據(jù)的訪問和操作,本文給大家詳細介紹了Spring Boot JPA如何把ORM統(tǒng)一起來,感興趣的朋友一起看看吧
    2018-04-04
  • Java線程通信之wait-notify通信方式詳解

    Java線程通信之wait-notify通信方式詳解

    這篇文章主要為大家詳細介紹了Java線程通信之wait-notify通信方式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • springboot實現(xiàn)注冊加密與登錄解密功能(demo)

    springboot實現(xiàn)注冊加密與登錄解密功能(demo)

    這篇文章主要介紹了springboot實現(xiàn)注冊的加密與登錄的解密功能,本文通過demo實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 5分鐘快速上手Spring Boot

    5分鐘快速上手Spring Boot

    這篇文章主要介紹了5分鐘快速上手Spring Boot,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04

最新評論

贞丰县| 井冈山市| 武城县| 温宿县| 东方市| 云阳县| 乐安县| 长春市| 沙坪坝区| 龙江县| 临武县| 绥芬河市| 东乌珠穆沁旗| 张家川| 朝阳县| 汕尾市| 察雅县| 当涂县| 两当县| 太仓市| 萍乡市| 新蔡县| 新兴县| 东莞市| 米脂县| 涿州市| 宝坻区| 河东区| 鹿泉市| 昔阳县| 四子王旗| 汝城县| 固镇县| 绥滨县| 宁城县| 汾阳市| 顺平县| 米脂县| 揭西县| 泰顺县| 塔河县|