Spring Boot改ページPagease最大sizeのカスタムプロファイル


  • 起因
  • 仕事では、導出機能に関し、導出と検索の結果は同じであるため、導出と検索は同じインターフェースである.しかし、検索ページは各ページ10ページですので、エクスポートには制限がないので、以下の問題を引き出します.
  • controller方法は以下の通りです.
    @PostMapping("/orders/search")
    public Page getOrders(@RequestBody @Valid Search search,
                                          @PageableDefault(
                                                  sort = {"modifiedDate", "createdDate"},
                                                  direction = Sort.Direction.DESC
                                          ) Pageable pageable) {
    
        return preOrderService.getOrders(search, pageable);
    }
    はフロントエンドから渡されたpage sizeによって改ページサイズを設定しています.使用中に、pageのsizeがどれだけ大きいかにかかわらず、最大2000本しか導き出せないことが分かりました.ソースの中で最大値の制限があるかもしれません.このようにソースコードを追跡します.
  • カスタムページ構成により、カスタムsizeが最大10000
  • であることを解決します.
    /**
    * 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  2000
        private 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   2000
        private int maxPageSize = DEFAULT_MAX_PAGE_SIZE;
    
        @Override
        public 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 bound
            pageSize = 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 configured
            sort = sort == null && defaultOrFallback != null ? defaultOrFallback.getSort() : sort;
    
            return new PageRequest(page, pageSize, sort);
        }
    }