Spring Boot v2.2.2.RELEASE分页大小超预期报错问题求助
针对你用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

