So, in another thread I posted that it would be nice to not have to have our api interface methods take a PageRequest, because in a Service interface we are tying UI or Query code into our Business Logic Service class. So I created one. Here is an example and the code for my ThreadLocal PageRequest.
Example, in my Controller, I get two path variables. One for page and one for size of page. I start there with my ThreadLocal
This line PageRequestHandler.setPageRequest(page, size); creates a PageRequest object and puts it into a ThreadLocal variable.Code:@RequestMapping(value="/friends/{page}/{size}", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK) public @ResponseBody ListOfDomains<User> getFriendsOfUser(@PathVariable("page") int page, @PathVariable("size") int size) { PageRequestHandler.setPageRequest(page, size); List<User> allUsers = userService.getFriends(userService.getUserFromSession()); return new ListOfDomains<User>(allUsers, UserDivsTitlesAndRelationships.FRIENDS); }
To get that PageRequest in my Service class, so I can pass it to my Spring Data Repo that takes a PageRequest as a param is
Code:public interface UserService { List<User> getFriends(User user);So PageRequestHandler.getPageRequest() gets me my PageRequest I put into ThreadLocal in my Controller.Code:@Override public List<User> getFriends(User user) { return userRepository.findFriends(user, PageRequestHandler.getPageRequest()) .getContent(); }
Here is the interface method in the Repo
Here is my PageRequestHandler class. It is not 100% complete for all variations, including sort and properties, but it is a start.Code:@Query("start user=node({0}) " + "match (user)-[:FRIEND]-(friends) " + "return friends " + "order by friends.lastName asc") public Page<User> findFriends(User user, Pageable page);
Hope it helps some people.Code:public class PageRequestHandler { private static ThreadLocal<PageRequest> pageRequestThreadLocal = new ThreadLocal<PageRequest>(); private static int defaultPageSize = 200; private static int defaultPage = 0; public static void setPageRequest(int page, int size) { PageRequest pageRequest = new PageRequest(page, size); pageRequestThreadLocal.set(pageRequest); } public static void setPageRequest(PageRequest pageRequest) { pageRequestThreadLocal.set(pageRequest); } public static PageRequest getPageRequest() { PageRequest pageRequest = pageRequestThreadLocal.get(); if (pageRequest == null) { pageRequest = new PageRequest(defaultPage, defaultPageSize); } setPageRequest(pageRequest); return pageRequest; } public static void setDefaultPage(int page) { defaultPage = page; } public static void setDefaultPageSize(int pageSize) { pageSize = pageSize; } }
Mark


Reply With Quote