烟台网站建设的公司成都百度seo推广
- 起因
在工作中,涉及到导出的功能,由于导出和搜索的结果是相同的,所以导出和搜索是同一接口。但由于搜索的分页是每页10条,而导出却是没有条数限制的,所以引出下面的问题
-
controller方法如下:
@PostMapping("/orders/search") public Page<SearchOrderOut> getOrders(@RequestBody @Valid Search search,@PageableDefault(sort = {"modifiedDate", "createdDate"},direction = Sort.Direction.DESC) Pageable pageable) {return preOrderService.getOrders(search, pageable); }
通过前端传递的pagesize来设定分页的大小,在使用中发现无论page的size修改为多大,导出最多只能2000条,于是怀疑源码中可能有最大值的限制,于是跟踪源码发现果真如此,源码如下(仅相关代码):
/** * Extracts paging information from web requests and thus allows injecting {@link Pageable} instances into controller * methods. Request properties to be parsed can be configured. Default configuration uses request parameters beginning * with {@link #DEFAULT_PAGE_PARAMETER}{@link #DEFAULT_QUALIFIER_DELIMITER}. * * 从Web请求中提取分页信息,从而允许将Pageable实例注入controller方法 * 可以配置要解析的请求属性,默认配置使用以DEFAULT_PAGE_PARAMETER,DEFAULT_QUALIFIER_DELIMITER开头的请求参数 * * @since 1.6 * @author Oliver Gierke * @author Nick Williams * @author Mark Paluch */ public class PageableHandlerMethodArgumentResolver implements PageableArgumentResolver {private static final String DEFAULT_PAGE_PARAMETER = "page";private static final String DEFAULT_SIZE_PARAMETER = "size";private static final String DEFAULT_PREFIX = "";private static final String DEFAULT_QUALIFIER_DELIMITER = "_";// 默认page size最大2000private static final int DEFAULT_MAX_PAGE_SIZE = 2000;static final Pageable DEFAULT_PAGE_REQUEST = new PageRequest(0, 20);private Pageable fallbackPageable = DEFAULT_PAGE_REQUEST;private SortArgumentResolver sortResolver;private String pageParameterName = DEFAULT_PAGE_PARAMETER;private String sizeParameterName = DEFAULT_SIZE_PARAMETER;private String prefix = DEFAULT_PREFIX;private String qualifierDelimiter = DEFAULT_QUALIFIER_DELIMITER;// maxPageSize 最大2000private int maxPageSize = DEFAULT_MAX_PAGE_SIZE;@Overridepublic Pageable resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {assertPageableUniqueness(methodParameter);Pageable defaultOrFallback = getDefaultFromAnnotationOrFallback(methodParameter);String pageString = webRequest.getParameter(getParameterNameToUse(pageParameterName, methodParameter));// sizeParameterName="size",从请求中拿到size值String pageSizeString = webRequest.getParameter(getParameterNameToUse(sizeParameterName, methodParameter));boolean pageAndSizeGiven = StringUtils.hasText(pageString) && StringUtils.hasText(pageSizeString);if (!pageAndSizeGiven && defaultOrFallback == null) {return null;}int page = StringUtils.hasText(pageString) ? parseAndApplyBoundaries(pageString, Integer.MAX_VALUE, true): defaultOrFallback.getPageNumber();int pageSize = StringUtils.hasText(pageSizeString) ? parseAndApplyBoundaries(pageSizeString, maxPageSize, false): defaultOrFallback.getPageSize();// Limit lower boundpageSize = pageSize < 1 ? defaultOrFallback.getPageSize() : pageSize;// Limit upper bound// 无论上面怎么处理,pageSize>2000的话,pageSize=2000,否则就是pageSize的值pageSize = pageSize > maxPageSize ? maxPageSize : pageSize;Sort sort = sortResolver.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);// Default if necessary and default configuredsort = sort == null && defaultOrFallback != null ? defaultOrFallback.getSort() : sort;return new PageRequest(page, pageSize, sort);} }
-
自定义page配置来解决
自定义size最大为10000
import org.springframework.context.annotation.Configuration;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import java.util.List;@Configuration
public class PageConfig extends WebMvcConfigurerAdapter {private static final int PMP_MAX_PAGE_SIZE = 10000;@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();resolver.setMaxPageSize(PMP_MAX_PAGE_SIZE);argumentResolvers.add(resolver);super.addArgumentResolvers(argumentResolvers);}
}
来源于:
https://blog.csdn.net/u010634897/article/details/81612124