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

Spring Boot v2.2.2.RELEASE分页大小超预期报错问题求助

解决Spring Boot分页Size超过200限制不生效的问题

针对你用Spring Boot 2.2.2.RELEASE + Spring Data Mongo + Spring REST + Spring HATEOAS搭建项目时,分页Size限制不生效的问题,我整理了几个可行的解决思路:

1. 补充Spring Data REST全局分页配置

你当前继承了RepositoryRestMvcConfiguration但只重写了pageableResolver,可能漏掉了Spring Data REST本身的全局分页规则配置。尝试在你的RespositoryConfiguration类中添加以下方法:

@Override
protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    super.configureRepositoryRestConfiguration(config);
    // 设置Spring Data REST全局最大分页Size
    config.setMaxPageSize(200);
}

这个方法是Spring Data REST专门用于配置REST仓库全局规则的,和你之前的参数解析器配置配合,能同时覆盖参数解析和数据查询层面的分页大小限制。

2. 手动注册参数解析器避免配置冲突

有时候继承RepositoryRestMvcConfiguration可能会和默认配置产生冲突,你可以改用WebMvcConfigurer手动注册参数解析器,更直接地控制生效逻辑:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Value("${paging.default.pageSize:25}")
    private int defaultSize;
    @Value("${paging.default.page:0}")
    private int defaultPage;
    @Value("${spring.data.web.pageable.max-page-size:200}")
    private int maxPageSize;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        HateoasPageableHandlerMethodArgumentResolver resolver = new HateoasPageableHandlerMethodArgumentResolver();
        resolver.setPageParameterName("page");
        resolver.setSizeParameterName("size");
        resolver.setOneIndexedParameters(false);
        resolver.setFallbackPageable(PageRequest.of(defaultPage, defaultSize));
        resolver.setMaxPageSize(maxPageSize);
        resolvers.add(resolver);
    }
}

这种方式能确保自定义的参数解析器被Spring MVC正确加载,避免父类配置的覆盖问题。

3. 添加手动校验兜底逻辑

如果上面的配置仍不生效,你可以在控制器或Repository层添加手动校验,直接拦截超出限制的请求:

控制器层用@InitBinder拦截参数

在你的REST控制器中添加参数绑定逻辑,直接校验size参数:

@InitBinder
public void initPageableBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Pageable.class, new PropertyEditorSupport() {
        @Override
        public void setAsText(String text) {
            int page = 0;
            int size = 25;
            // 解析分页参数
            for (String part : text.split(",")) {
                String[] keyValue = part.split("=");
                if ("page".equals(keyValue[0])) {
                    page = Integer.parseInt(keyValue[1]);
                } else if ("size".equals(keyValue[0])) {
                    size = Integer.parseInt(keyValue[1]);
                    if (size > 200) {
                        throw new IllegalArgumentException("最大允许大小为200");
                    }
                }
            }
            setValue(PageRequest.of(page, size));
        }
    });
}

Repository层自定义带校验的查询方法

在你的MongoRepository接口中添加默认方法,提前校验分页大小:

public interface YourEntityRepository extends MongoRepository<YourEntity, String> {

    default Page<YourEntity> findAllWithSizeLimit(Pageable pageable) {
        if (pageable.getPageSize() > 200) {
            throw new IllegalArgumentException("最大允许大小为200");
        }
        return findAll(pageable);
    }
}

之后在控制器中调用这个自定义方法,替代默认的findAll接口。

4. 确认配置属性一致性

检查application.properties中的spring.data.web.pageable.max-page-size=200配置是否被正确读取,建议在配置类中通过@Value注入该属性,而非硬编码200,避免配置和代码不一致的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:42:45