Spring Data分页从1起始而非0的实现求助(Spring Boot 3.0.6)
让Spring Data分页从1开始的解决方案
问题分析
你设置的spring.data.web.pageable.one-indexed-parameters=true或自定义PageableHandlerMethodArgumentResolverCustomizer Bean,作用是将前端传入的页码参数(如page=1)自动转换为底层JPA查询使用的0索引,但Spring Data的Page对象本身仍会以0索引返回页码。如果你的分页仍从0开始,可能是两种情况:要么请求参数转换未生效,要么你需要修改返回结果的页码显示。
解决方案
1. 确保请求参数转换配置生效
首先验证配置是否正确加载:
- 检查配置文件(如
application.yml)的缩进是否正确,YAML对缩进敏感,确保spring.data.web.pageable.one-indexed-parameters的层级正确。 - 自定义的
PageableHandlerMethodArgumentResolverCustomizerBean所在类必须带有@Configuration注解,确保被Spring容器扫描到。 - 测试接口:前端传入
page=1,在Controller中打印pageable.getPageNumber(),如果输出0,说明配置已生效,底层查询的是第一页数据。
2. 修改返回结果的页码为1索引
如果需要让返回给前端的页码显示为1(而非底层的0),需要转换Page对象:
方式一:自定义分页响应DTO
创建一个封装类,将Spring Data的Page转换为1索引的结构:
public class PageResponse<T> { private int page; private int size; private long totalElements; private int totalPages; private List<T> content; public PageResponse(Page<T> page) { this.page = page.getNumber() + 1; // 将0索引转为1索引 this.size = page.getSize(); this.totalElements = page.getTotalElements(); this.totalPages = page.getTotalPages(); this.content = page.getContent(); } // 生成getter和setter方法 }
在Controller中使用该DTO返回结果:
@GetMapping("/your-api") public PageResponse<YourEntity> getPagedData(Pageable pageable) { Page<YourEntity> pageResult = yourRepository.findAll(pageable); return new PageResponse<>(pageResult); }
方式二:全局统一处理分页返回结果
使用@ControllerAdvice实现ResponseBodyAdvice,全局转换所有Page类型的响应:
@ControllerAdvice public class PageIndexConverterAdvice implements ResponseBodyAdvice<Page<?>> { @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { return Page.class.isAssignableFrom(returnType.getParameterType()); } @Override public Object beforeBodyWrite(Page<?> body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { return new PageResponse<>(body); } }
3. 排查自定义PageableResolver的冲突
如果项目中自定义了PageableHandlerMethodArgumentResolver,需确保在该Resolver中显式设置setOneIndexedParameters(true),避免覆盖默认配置:
@Bean public PageableHandlerMethodArgumentResolver pageableResolver() { PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); resolver.setOneIndexedParameters(true); return resolver; }
内容的提问来源于stack exchange,提问作者rben
相关产品推荐
相关产品推荐

