Background:
HandlerMethodArgumentResolver is a strategy interface to resolve method parameters in context of given context. So, if you want to automatically resolve the parameter MyObject in the following method, you can create a bean of HandlerMethodArgumentResolver and implement logic to resolve the argument.
@GetMapping("/users")
public Page<User> getUsers(MyObject object) {
Spring Framework already provides a lot of resolvers to handle various parameters such as AuthenticationPrincipal, CSRF, Session, Cookie, MVC Model, and of course Pageable.
Pageable Resolver:
Spring Data comes with PageableHandlerMethodArgumentResolver to resolve pageable parameter from the request URL.
If you send a request /users?size=20&page=2, the Pageable object will be injected to the method parameter.
@GetMapping("/users")
public Page<User> getUsers(Pageable pageable) {
return userRepository.findAllByStatus(Status.ACTIVE, pageable);
}
Customize PageableHandlerMethodArgumentResolver
To customize the Pageable resolver, we need to create a bean of PageableHandlerMethodArgumentResolverCustomizer , which will be applied at SpringDataWebConfiguration#customizePageableResolver before the pageableResolver() is created SpringDataWebConfiguration#pageableResolver.
PageableHandlerMethodArgumentResolverCustomizer is a SAM (single method interface aka FunctionalInterface).
Setting max page size
@Bean
public PageableHandlerMethodArgumentResolverCustomizer paginationCustomizer() {
return pageableResolver -> {
pageableResolver.setMaxPageSize(20); //default is 2000
pageableResolver.setPageParameterName("pageNumber"); //default is page
pageableResolver.setSizeParameterName("elementsPerPage"); //default is size
};
}
Now the url should be /users?elementsPerPage=20&pageNumber=2 instead of /users?size=20&page=2.
If you pass elementsPerPage more than 20, it will be defaulted back to 20.
Which will be helpful to prevent potential attacks trying to issue an OutOfMemoryError.