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

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的层级正确。
  • 自定义的PageableHandlerMethodArgumentResolverCustomizer Bean所在类必须带有@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:29:50