1717
1818import static org .springframework .data .web .SpringDataAnnotationUtils .*;
1919
20+ import java .lang .reflect .Method ;
21+
2022import org .springframework .beans .factory .annotation .Qualifier ;
2123import org .springframework .core .MethodParameter ;
2224import org .springframework .data .domain .PageRequest ;
4143@ SuppressWarnings ("deprecation" )
4244public class PageableHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
4345
46+ private static final String INVALID_DEFAULT_PAGE_SIZE = "Invalid default page size configured for method %s! Must not be less than one!" ;
47+
4448/**
4549 * A {@link PageableHandlerMethodArgumentResolver} preconfigured to the setup of {@link PageableArgumentResolver}. Use
4650 * that if you need to stick to the former request parameters an 1-indexed behavior. This will be removed in the next
@@ -58,12 +62,12 @@ public class PageableHandlerMethodArgumentResolver implements HandlerMethodArgum
5862LEGACY .sortResolver .setSortParameter ("page.sort" );
5963}
6064
61- private static final Pageable DEFAULT_PAGE_REQUEST = new PageRequest (0 , 20 );
6265private static final String DEFAULT_PAGE_PARAMETER = "page" ;
6366private static final String DEFAULT_SIZE_PARAMETER = "size" ;
6467private static final String DEFAULT_PREFIX = "" ;
6568private static final String DEFAULT_QUALIFIER_DELIMITER = "_" ;
6669private static final int DEFAULT_MAX_PAGE_SIZE = 2000 ;
70+ static final Pageable DEFAULT_PAGE_REQUEST = new PageRequest (0 , 20 );
6771
6872private Pageable fallbackPageable = DEFAULT_PAGE_REQUEST ;
6973private SortHandlerMethodArgumentResolver sortResolver ;
@@ -234,6 +238,10 @@ public Pageable resolveArgument(MethodParameter methodParameter, ModelAndViewCon
234238: defaultOrFallback .getPageNumber ();
235239int pageSize = StringUtils .hasText (pageSizeString ) ? Integer .parseInt (pageSizeString ) : defaultOrFallback
236240.getPageSize ();
241+
242+ // Limit lower bound
243+ pageSize = pageSize < 1 ? defaultOrFallback .getPageSize () : pageSize ;
244+ // Limit upper bound
237245pageSize = pageSize > maxPageSize ? maxPageSize : pageSize ;
238246
239247Sort sort = sortResolver .resolveArgument (methodParameter , mavContainer , webRequest , binderFactory );
@@ -269,17 +277,24 @@ private Pageable getDefaultFromAnnotationOrFallback(MethodParameter methodParame
269277}
270278
271279if (methodParameter .hasParameterAnnotation (PageableDefault .class )) {
272- return getDefaultPageRequestFrom (methodParameter . getParameterAnnotation ( PageableDefault . class ) );
280+ return getDefaultPageRequestFrom (methodParameter );
273281}
274282
275283return fallbackPageable ;
276284}
277285
278- private static Pageable getDefaultPageRequestFrom (PageableDefault defaults ) {
286+ private static Pageable getDefaultPageRequestFrom (MethodParameter parameter ) {
287+
288+ PageableDefault defaults = parameter .getParameterAnnotation (PageableDefault .class );
279289
280290Integer defaultPageNumber = defaults .page ();
281291Integer defaultPageSize = getSpecificPropertyOrDefaultFromValue (defaults , "size" );
282292
293+ if (defaultPageSize < 1 ) {
294+ Method annotatedMethod = parameter .getMethod ();
295+ throw new IllegalStateException (String .format (INVALID_DEFAULT_PAGE_SIZE , annotatedMethod ));
296+ }
297+
283298if (defaults .sort ().length == 0 ) {
284299return new PageRequest (defaultPageNumber , defaultPageSize );
285300}
0 commit comments