簡體   English   中英

Jackson-帶有自引用的序列化實體

[英]Jackson - Serialize entity with self-reference

我有以下實體:

@Entity
@Table(name = "registry_entry")
@JsonIgnoreProperties(ignoreUnknown = true)
public class RegistryEntry extends GenericEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(unique = true, nullable = false)
  @JsonProperty("id")
  protected Long id;
  ...
  @ManyToMany(fetch = FetchType.EAGER)
  @JoinTable(name = "srv_registry_entry_related_dependence",
    joinColumns = @JoinColumn(name = "id_reg_entry", referencedColumnName = "id"),
    inverseJoinColumns = @JoinColumn(name = "id_related_reg_entry", referencedColumnName = "id"))
  @JsonProperty
  private List<RegistryEntry> relatedRegistryEntries;
  ...
}

假設我們有實體AB ,其中B.relatedRegistryEntries包含AA.relatedRegistryEntries包含B

當我嘗試序列化AB ,出現StackOverflowError 我如何只序列化此列表中的ID?

傑克遜支持@JsonIdentityInfo 這就是您要描述的:將注釋添加到類中后,該類的所有實例將使用附加的ID字段進行序列化,下一次需要序列化同一實例時,將寫入該ID字段的值而不是整個對象。

但是,請注意,這不是標准的JSON。 通常,通常使用JSON格式,因為許多庫廣泛支持JSON格式。 使用此功能可能會給您的API客戶端帶來其他問題。

更加通用的兼容方法是序列化沒有自我引用字段的自我引用對象:

public class RegistryEntry {
        @JsonIgnoreProperties("relatedRegistryEntries")
        private List<RegistryEntry> relatedRegistryEntries;
}

將此注釋添加到我的課程中解決了我的問題。

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "id") 

我有一個自引用實體,Jackson為此陷入了無限循環。 盡管有問題的財產是暫時的,但Jakson仍在嘗試序列化並發出問題。

暫無
暫無

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

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