[英]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;
...
}
假設我們有實體A
和B
,其中B.relatedRegistryEntries
包含A
而A.relatedRegistryEntries
包含B
當我嘗試序列化A
或B
,出現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.