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
相关产品推荐
相关产品推荐

