gpt4 book ai didi

java - Jackson - 使用 self 引用序列化实体

转载 作者:行者123 更新时间:2023-12-01 18:04:50 24 4
gpt4 key购买 nike

我有以下实体:

@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.latedRegistryEntries 包含 AA .latedRegistryEntries 包含 B

当我尝试序列化 AB 时,我收到 StackOverflowError。如何仅序列化此列表中的 id?

最佳答案

jackson 支持@JsonIdentityInfo 。这就是您所描述的:将此注释添加到类将使该类的所有实例都使用附加 ID 字段进行序列化,并且下次需要序列化同一实例时,将写入该 ID 字段的值而不是整个对象。

但是请注意,这不是标准 JSON。一般来说,通常使用 JSON 格式,因为它受到许多库的广泛支持。使用此功能可能会给您的 API 客户端带来更多问题。

更普遍兼容的方法是序列化自引用对象而不带其自引用字段:

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

关于java - Jackson - 使用 self 引用序列化实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37388613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com