簡體   English   中英

使用分頁對計算字段進行服務器端排序?

[英]Server side sorting for calculated fields with pagination?

我們必須顯示一些支持分頁和服務器端排序的表格數據。 它是一個 React、JAVA、SQL 堆棧。 在設計 REST API 時,我們同意返回一個表示表中每一行的復合對象。 該對象是由具有大量業務邏輯的復雜 SQL 創建的。 對象包括多個對象,每個對象包括多個字段。 這背后的想法是返回一個通用對象,這樣我們就不必創建請求特定的 DTO。

然而,我們只需要使用這個對象中的幾個字段。 UI 上顯示的幾列是基於此對象中的多個字段計算得出的。 真正的挑戰是當我們必須在服務器端對這些計算字段進行排序時,因為我們只獲取必須顯示在頁面上的記錄。 我們很想通過在服務器端進行計算來重構響應以匹配 UI 列,因為我們會遇到多個 DTO 問題。 如何以最好的方式實現這一目標? 是否有任何最佳做法? 我在互聯網上找不到太多。

對於服務器需要進行大量處理而不是立即返回答案的類似問題,我將請求拆分為幾個部分。

1) 向服務器發送請求,以構建結果。 它不是將結果返回給客戶端,而是將結果與結果引用 ID 一起存儲在數據庫中的結果表中,該 ID 作為對 POST 請求的回復返回給客戶端。 這些結果將包括要排序的計算字段。 在將引用 ID 返回給客戶端后,服務器可能會繼續在后台構建這些結果。 服務器應該回復 202 Accepted 響應,而不是 201 Created。

2) GET 向服務器發出查詢此結果表的請求,並傳遞引用 ID。 包括要排序的字段。 如果服務器仍在構建列表,它可以返回 OK 200,但使用描述“構建”的 JSON 結構在此期間,客戶端可能會顯示計時器動畫,並將每隔幾秒重復一次請求。

3)當最終建表時,服務器根據需要傳回分頁數據。

4) 完成后,客戶端可以發送帶有引用 ID 的 DELETE 來清理結果表。 但是,應該有某種清理過程來清理超過一天的結果。

有關更多信息,請參見此處: https : //farazdagi.com/2014/rest-and-long-running-jobs/

也在這里: http : //restcookbook.com/Resources/asynchreous-operations/

您使用什么將響應序列化為 JSON?

如果您使用 Jackson,我建議您使用 JSON 視圖來避免使用多個 DTO。 它允許您指定要在哪些情況下序列化哪些字段(大多數情況下由控制器決定)並且使用起來非常簡單。

這是有關如何使用它的教程: https : //www.baeldung.com/jackson-json-view-annotation

以及我如何使用它的示例(例如使用附件類):

這是我定義哪個屬性將包含在哪個視圖中的模型:

public class Attachment {

    @JsonView({
        Attachment.Views.Show.class, Attachment.Views.List.class
    })
    private Long id;

    @JsonView({
        Attachment.Views.Show.class, Attachment.Views.List.class
    })
    private String originalFilename;

    @JsonView({
        Attachment.Views.Show.class
    })
    private String filepath;

    @JsonView({
        Attachment.Views.Show.class
    })
    private String description;

        public static class Views {
        public static class Show {}
        public static class List {}
        public static class Create {}
        public static class Fill {}
        public static class Edit {}
    }

}

這是我的控制器:

public class AttachmentControllerImpl implements AttachmentController {

    @Inject
    private AttachmentService service;

    private ObjectMapper mapper;

    @Override
    public Response show(Long id) {
        Attachment attachment = service.getById(id);

        String json = mapper.writerWithView(Attachment.Views.Show.class).writeObjectAsString(attachment);
    }

    @Override
    public Response list() {
        List<Attachment> attachments = service.getAll();

        String json = mapper.writerWithView(Attachment.Views.List.class).writeObjectAsString(attachments);
    }

}

真的沒有比它更多的了,非常容易使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM