Spring Boot 2中如何使Pageable参数无传入时返回null
解决Spring Boot 2中Pageable无参数时返回null而非默认值的问题
我完全懂你的需求——默认情况下Spring Data会自动给Pageable填充page=0、size=20这类默认分页参数,但你希望当用户完全没传任何分页相关参数时,拿到的是null而不是这个默认对象。直接给Pageable加@RequestParam(required = false)确实没用,因为Pageable是由Spring Data专属的参数解析器处理的,不属于普通请求参数范畴。下面给你两个可行的解决方案:
方案1:自定义Pageable参数解析器(推荐)
这个方法最可靠,通过重写Spring Data的分页参数解析逻辑,让它在没有分页参数时返回null。
步骤1:创建自定义解析器类
继承Spring Data的PageableHandlerMethodArgumentResolver,重写参数解析逻辑:
import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import javax.servlet.http.HttpServletRequest; import java.util.Set; public class NullablePageableResolver extends PageableHandlerMethodArgumentResolver { // 定义分页相关的参数名集合 private static final Set<String> PAGE_PARAMS = Set.of("page", "size", "sort"); @Override public Pageable resolveArgument(HttpServletRequest request) { // 检查请求中是否存在任何分页相关参数 boolean hasPageParams = PAGE_PARAMS.stream() .anyMatch(request::getParameter); // 如果没有分页参数,直接返回null if (!hasPageParams) { return null; } // 否则沿用默认的解析逻辑生成Pageable对象 return super.resolveArgument(request); } }
步骤2:注册自定义解析器
创建一个Web配置类,替换Spring默认的Pageable解析器:
import org.springframework.context.annotation.Configuration; import org.springframework.data.web.config.EnableSpringDataWebSupport; import org.springframework.data.web.config.SpringDataWebConfiguration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import java.util.List; @Configuration @EnableSpringDataWebSupport public class CustomWebConfig extends SpringDataWebConfiguration { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { // 将自定义解析器放在最前面,确保优先被使用 argumentResolvers.add(0, new NullablePageableResolver()); // 别忘了添加其他默认的参数解析器 super.addArgumentResolvers(argumentResolvers); } }
完成这两步后,当用户请求/networks且不带任何分页参数时,接口里的page参数就会是null;如果传了page、size或sort中的任意一个,就会正常解析成对应的分页对象。
方案2:接口内手动判断(临时替代方案)
如果不想自定义解析器,也可以在接口里手动判断当前Pageable是否是默认值,再将其置为null。不过这个方法有个小缺陷:如果用户主动传了page=0&size=20(和默认值一致),也会被当成null处理,适合对这种场景不敏感的业务:
@GetMapping(value = "networks") public ResponseEntity<Page<Networks>> getNetworks( @RequestParam(required = false) String search, Pageable page) { // 判断是否是Spring Data生成的默认Pageable对象 boolean isDefaultPageable = page.getPageNumber() == 0 && page.getPageSize() == 20 && page.getSort().isEmpty(); if (isDefaultPageable) { page = null; } // 后续业务逻辑处理... }
内容的提问来源于stack exchange,提问作者robert trudel
相关产品推荐
相关产品推荐

