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.
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);
}
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).
@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.