17
17
18
18
import static org .springframework .data .web .SpringDataAnnotationUtils .*;
19
19
20
+ import java .lang .reflect .Method ;
21
+
20
22
import org .springframework .beans .factory .annotation .Qualifier ;
21
23
import org .springframework .core .MethodParameter ;
22
24
import org .springframework .data .domain .PageRequest ;
41
43
@ SuppressWarnings ("deprecation" )
42
44
public class PageableHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
43
45
46
+ private static final String INVALID_DEFAULT_PAGE_SIZE = "Invalid default page size configured for method %s! Must not be less than one!" ;
47
+
44
48
/**
45
49
* A {@link PageableHandlerMethodArgumentResolver} preconfigured to the setup of {@link PageableArgumentResolver}. Use
46
50
* 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
58
62
LEGACY .sortResolver .setSortParameter ("page.sort" );
59
63
}
60
64
61
- private static final Pageable DEFAULT_PAGE_REQUEST = new PageRequest (0 , 20 );
62
65
private static final String DEFAULT_PAGE_PARAMETER = "page" ;
63
66
private static final String DEFAULT_SIZE_PARAMETER = "size" ;
64
67
private static final String DEFAULT_PREFIX = "" ;
65
68
private static final String DEFAULT_QUALIFIER_DELIMITER = "_" ;
66
69
private static final int DEFAULT_MAX_PAGE_SIZE = 2000 ;
70
+ static final Pageable DEFAULT_PAGE_REQUEST = new PageRequest (0 , 20 );
67
71
68
72
private Pageable fallbackPageable = DEFAULT_PAGE_REQUEST ;
69
73
private SortHandlerMethodArgumentResolver sortResolver ;
@@ -234,6 +238,10 @@ public Pageable resolveArgument(MethodParameter methodParameter, ModelAndViewCon
234
238
: defaultOrFallback .getPageNumber ();
235
239
int pageSize = StringUtils .hasText (pageSizeString ) ? Integer .parseInt (pageSizeString ) : defaultOrFallback
236
240
.getPageSize ();
241
+
242
+ // Limit lower bound
243
+ pageSize = pageSize < 1 ? defaultOrFallback .getPageSize () : pageSize ;
244
+ // Limit upper bound
237
245
pageSize = pageSize > maxPageSize ? maxPageSize : pageSize ;
238
246
239
247
Sort sort = sortResolver .resolveArgument (methodParameter , mavContainer , webRequest , binderFactory );
@@ -269,17 +277,24 @@ private Pageable getDefaultFromAnnotationOrFallback(MethodParameter methodParame
269
277
}
270
278
271
279
if (methodParameter .hasParameterAnnotation (PageableDefault .class )) {
272
- return getDefaultPageRequestFrom (methodParameter . getParameterAnnotation ( PageableDefault . class ) );
280
+ return getDefaultPageRequestFrom (methodParameter );
273
281
}
274
282
275
283
return fallbackPageable ;
276
284
}
277
285
278
- private static Pageable getDefaultPageRequestFrom (PageableDefault defaults ) {
286
+ private static Pageable getDefaultPageRequestFrom (MethodParameter parameter ) {
287
+
288
+ PageableDefault defaults = parameter .getParameterAnnotation (PageableDefault .class );
279
289
280
290
Integer defaultPageNumber = defaults .page ();
281
291
Integer defaultPageSize = getSpecificPropertyOrDefaultFromValue (defaults , "size" );
282
292
293
+ if (defaultPageSize < 1 ) {
294
+ Method annotatedMethod = parameter .getMethod ();
295
+ throw new IllegalStateException (String .format (INVALID_DEFAULT_PAGE_SIZE , annotatedMethod ));
296
+ }
297
+
283
298
if (defaults .sort ().length == 0 ) {
284
299
return new PageRequest (defaultPageNumber , defaultPageSize );
285
300
}
0 commit comments