今天要實作內容分頁呈現以及排序的功能,在 URL 中可以加入一些相關 query 的參數,例如: sortBy=title等來做過濾篩選資料。
Pagination 會有兩個部分: 一個是 page size, 另外一個是 page number。
而在系統架構中,與前幾次 API 實作不同的是,用的 Repository 並不是繼承 ListCrudRepository
而是ListPagingAndSortingRepository
的 PagingAndSortingRepository
不過此次在實作的過程中,遇到了一些問題,所以這次並不會成功實做出來,主要是紀錄學習上心路歷程的部分。
在掌管 url 路徑的邏輯中,會需要修改抓取所有資料的 function: getAllPost
需要修改成以下程式:
@GetMapping
public List<PostDto> getAllPost(){
@RequestParam(value="pageNo", defaultValue="0", required=false)
return postService.getAllPosts();
}
在 Repository 中,就如剛剛有講到的,會使用 PagingAndSortingRepository
PostRepository 會繼承 JpaRepository ,而 JpaRepository 則會繼承 ListCrudRepository
ListPagingAndSortingRepository
QueryByExampleExecutor
其中的 ListPagingAndSortingRepository
則繼承 PagingAndSortingRepository
,這個就會是這次實作會使用到的 Repository
其中有 Page<T> findAll(Pageable pageable);
Iterable<T> findAll(Sort sort);
會用來尋找資料並呈現相對應頁面的內容~
在 PostService.java 中需要修改 getAllPosts() 裡面所帶入的參數內容,如下:
List<PostDto> getAllPosts(int pageNo,int pageSize);
在 PostServiceImpl.java 的 getAllPost() 中需要放入 page number 以及 page size 這兩個參數。
不過這邊就是出錯的部分,理應在 Repository 有繼承 Page 相關的實作形式後,就可以使用 Pageable 以及 PageRequest 的 class,並不需要做轉換,但這裡會報錯,會需要做轉換才能運行~ 這樣就無法在下方的 findAll() 中正確使用 pageable 的變數
public List<PostDto> getAllPosts(int pageNo, int pageSize) {
// create Pageable instance
Pageable pageable =PageRequest.of(pageNo, pageSize);
Page<Post> posts = postRepository.findAll(pageable);
//get content for page object
List<Post> listOfPosts = posts.getContent();
return posts.stream().map(post->mapToDTO(post)).collect(Collectors.toList());
}
這邊先記錄到出錯的部分,下一篇會記錄 debug 以及解決方法~
有興趣的夥伴們記得來看喔~
此外,若文中有錯誤之處還請多多包涵與指正,或是知道要如何解決的大神們也歡迎在下方留言指點我,小妹將萬分感謝~~ 歡迎在文章下方留言一起討論喔!
明天見~