iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
SideProject30

Java Spring + Vue 甘苦學習路 前後端分離之 Blog 實戰系列 第 11

Day11 Java Spring API 實作 — Pagination and 排序 Part2

  • 分享至 

  • xImage
  •  

概述

昨天說道在實作 Pagination 和排序時,遇到資料型態無法正確被使用的情形,後來發現是在 PostServiceImpl.java 中匯入錯模組了,應該要是:

import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.PageRequest;

但昨日 import 的模組是:

import java.awt.print.Pageable;
import org.springframework.data.domain.PageRequest;

java.awt.print 這個系列的模組主要提供類別與介面用來印出 API,而不是用於分頁資料設定。

在更改模組匯入後,就可以正常執行了,可以在 Postman 中輸入:

http://localhost:8080/api/posts?pageNo=0&pageSize=1

來做測試。選用的方法是 GET

測試的 URL 形式: http://localhost:8080/api/posts?pageNo={number}&pageSize={number}

https://ithelp.ithome.com.tw/upload/images/20230917/20126089DJoJ4P1RMA.png

接下來將會繼續針對分頁功能時作客制化的回應~

Payloads

  1. 在 Payloads 中新增一個名為 PostResponse.java 的 class
  2. 新增以下變數:
private List<PostDto> content;
private int pageNo;
private int pageSize;
private long totalElements;
private long totalPages;
private boolean last;

這些變數會用來控制或是紀錄頁數的號碼、總量等

  1. 需要使用以下這兩個註釋
@Data
@AllArgsConstructor

@Data 使用後就不需要手寫 Getter, Setter, equals 等

而 @AllArgsConstructor 則是會產生全類別參數的建構子

Service 層

PostServiceImpl.java 中修改 getAllPosts() 這個 function,以下為修改後內容:

除了取得 post 的資料外,也會回傳分頁相關的資訊

@Override
    public PostResponse getAllPosts(int pageNo, int pageSize) {
        // 也需要修改 PostService.java
        // 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());
        List<PostDto> content =  posts.stream().map(post->mapToDTO(post)).collect(Collectors.toList());
        PostResponse postResponse = new PostResponse();
        postResponse.setContent(content);
        postResponse.setPageNo(posts.getNumber());
        postResponse.setPageSize(posts.getSize());
        postResponse.setTotalElements(posts.getTotalElements());
        postResponse.setTotalPages(posts.getTotalPages());
        postResponse.setLast(posts.isLast());

        return postResponse;

要記得將 PostService.java 的 getAllPosts() 的回傳 type 改成 PostResponse

Controller 層

也是要記得將 getAllPosts() 的回傳 type 改成 PostResponse

@GetMapping
    public PostResponse getAllPost(
        @RequestParam(value="pageNo", defaultValue="0", required=false) int pageNo,
                @RequestParam(value="pageSize",defaultValue="10", required=false) int pageSize){
        return postService.getAllPosts(pageNo, pageSize);
    }

API 測試

在 Postman 中測試分頁的功能,可以在回傳的值中看到在 Service 中撈出的分頁資訊,可以用其他的 URL 路徑來作測試,例如:

http://localhost:8080/api/posts?pageNo=10&pageSize=1
https://ithelp.ithome.com.tw/upload/images/20230917/20126089DvHvBWphoJ.png

今天解決了錯誤的部分,並也測試了分頁資訊回傳的功能,接下來會實作排序的功能~
有興趣的夥伴們記得來看喔~

此外,若文中有錯誤之處還請多多包涵與指正,歡迎在文章下方留言一起討論喔!

明天見~


上一篇
Day 10 Java Spring API 實作 — Pagination and 排序 part1
下一篇
Day12 Java Spring API 實作 — 排序 Part1
系列文
Java Spring + Vue 甘苦學習路 前後端分離之 Blog 實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言