簡體   English   中英

Spring Boot + Jackson:根據所調用的REST API以不同的方式序列化對象

[英]Spring Boot + Jackson: Serialize an object in different ways depending on the called REST API

我正在開發一個公開REST API的Spring Boot Web應用程序,並且在JSON序列化方面遇到麻煩。

假設我有兩個類A和B,它們是一對多的雙向關系。

這意味着我有這樣的事情:

public class A {
    private List<B> bList;
    ...
}

public class B {
    private A owner;
    ...
}

當涉及到JSON序列化時,當然會有一個循環。

這是我的問題:

  • 在專注於A API方法中(例如“向我提供數據庫中所有As的列表”),我想要JSON序列化,其中:
    • A對象確實包含B的列表
    • B對象不包含其A所有者
  • 在關注B API方法中(例如“給我DB中所有B的列表”),我想要一個JSON序列化,其中:
    • A對象不包含其B的列表
    • B對象確實包含其A所有者

我相信我可以將其與@JsonView注釋一起使用,但是我認為這不是一個優雅的解決方案。 在我的應用程序(具有兩個以上的類)中,我需要創建和管理至少4或5個JsonViews:因此,在我的模型類中,對於每個屬性,我必須管理一堆凌亂的@JsonView批注。 相反,我認為模型類不應意識到這樣的事實,即它們根據API方法具有不同的JSON表示形式。

我搜索了如何使用自定義JSON序列化程序,並發現Jackson允許使用其SimpleModule進行此操作。 但是,似乎SimpleModule不允許視情況選擇要使用的序列化程序(它始終使用最后添加的序列化程序)。

所以我現在有點笨了。 有人知道允許控制器選擇如何序列化類的一種干凈方法嗎?

我認為您應該在此處使用DTO ,可以對不同的終結點使用不同的DTO ,並且可以選擇要包括或排除的字段。 另外,如果需要,可以裝飾它們。

在這里,您有在端點中使用DTO的好處的列表: REST API-是否使用DTO

使用@JsonIdentityInfo

您的問題已在此處回答: Jackson-具有雙向關系的實體的序列化(避免循環)

您可以對實體使用@JsonManagedReference批注,也可以使用@JsonIdentityInfo@JsonBackReference

您甚至可以使用@JsonIgnore@JsonView忽略關系的@JsonView

如果要自己管理序列化/反序列化,請使用自定義實現(例如@JsonDeserialize )。

Eugen為此提供了很好的教程

暫無
暫無

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

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