You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data PagedListHolder分页大小大于15时返回结果异常如何解决?

问题原因

PagedListHolder的页码采用0起始计数规则,你代码中传入的当前页码值为1,对应取第二页数据:

  • 总数据量30条,页大小设置为29时,第0页对应下标0~28,共29条数据
  • 第1页对应下标29~29,共1条数据,和你得到的结果一致,不属于框架bug,是页码计数规则不匹配导致的问题
修复方案

1. 基础适配(适配1起始的业务页码规则)

如果你的业务层传递的页码是常用的1起始规范,只需要在设置页码时减1即可:

private List<WorklistResponse> getPaginatedResponseResult(List<WorklistResponse> worklistResponse, FilterRequest filterRequest) {
    PagedListHolder<WorklistResponse> pagedListHolder = new PagedListHolder<>();

    pagedListHolder.setSource(worklistResponse);
    // 业务层1起始页码转框架需要的0起始
    pagedListHolder.setPage(filterRequest.getCurrentPage() - 1);
    pagedListHolder.setPageSize(filterRequest.getPageSize());

    return pagedListHolder.getPageList();
}

2. 全边界适配(兼容任意分页参数输入)

如果要兼容非法参数(比如页码超过最大页数、页大小为0/负数、页大小超过总数据量),可以增加参数校验逻辑:

private List<WorklistResponse> getPaginatedResponseResult(List<WorklistResponse> worklistResponse, FilterRequest filterRequest) {
    // 空数据源直接返回空
    if (worklistResponse == null || worklistResponse.isEmpty()) {
        return Collections.emptyList();
    }
    PagedListHolder<WorklistResponse> pagedListHolder = new PagedListHolder<>();
    pagedListHolder.setSource(worklistResponse);

    // 页大小合法性校验,至少为1
    int pageSize = Math.max(filterRequest.getPageSize(), 1);
    pagedListHolder.setPageSize(pageSize);

    // 页码合法性校验:1起始转0起始,且不能超过最大页码
    int maxPage = pagedListHolder.getMaxPage();
    int currentPage = Math.min(filterRequest.getCurrentPage() - 1, maxPage);
    // 页码不能小于0
    currentPage = Math.max(currentPage, 0);
    pagedListHolder.setPage(currentPage);

    return pagedListHolder.getPageList();
}
补充说明

你贴出的getPageList()源码逻辑是正确的:subList方法本身是左闭右开区间,所以结束下标需要在最后一条元素的下标基础上加1,不属于问题诱因。

内容的提问来源于stack exchange,提问作者Ruturaj Shinde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:39:03