Java Jackson-使用自引用序列化实体

Java Jackson-使用自引用序列化实体,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我拥有以下实体: @Entity @Table(name = "registry_entry") @JsonIgnoreProperties(ignoreUnknown = true) public class RegistryEntry extends GenericEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(unique = true, nullable = false)

我拥有以下实体:

@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;
  ...
}
@实体
@表(name=“注册表项”)
@JsonIgnoreProperties(ignoreUnknown=true)
公共类RegistryEntry扩展了GenericEntity{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(unique=true,nullable=false)
@JsonProperty(“id”)
保护长id;
...
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“srv\u注册表项相关依赖项”,
joinColumns=@JoinColumn(name=“id\u reg\u entry”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“id\u related\u reg\u entry”,referencedColumnName=“id”))
@JsonProperty
私有列表相关注册表项;
...
}
假设我们有实体
A
B
,其中
B.relatedRegistryEntries
包含
A
A.relatedRegistryEntries
包含
B

当我尝试序列化
A
B
时,会得到
stackoverflowerrror
。如何仅序列化此列表中的id?

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

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

更通用的兼容方法是序列化自引用对象,而不使用其自引用字段:

public class RegistryEntry {
        @JsonIgnoreProperties("relatedRegistryEntries")
        private List<RegistryEntry> relatedRegistryEntries;
}
公共类注册表项{
@JsonIgnoreProperties(“相关注册表项”)
私有列表相关注册表项;
}
杰克逊支持。这就是您所描述的:将此注释添加到类将使该类的所有实例都使用附加的ID字段序列化,并且下次需要序列化同一实例时,将写入该ID字段的值,而不是整个对象

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

更通用的兼容方法是序列化自引用对象,而不使用其自引用字段:

public class RegistryEntry {
        @JsonIgnoreProperties("relatedRegistryEntries")
        private List<RegistryEntry> relatedRegistryEntries;
}
公共类注册表项{
@JsonIgnoreProperties(“相关注册表项”)
私有列表相关注册表项;
}

将此注释添加到我的类解决了我的问题

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "id") 
我有一个自引用实体,Jackson在无限循环中对其进行引用。
虽然问题中的属性是暂时的,但Jakson仍在尝试序列化并给出问题。

将此注释添加到我的类解决了我的问题

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "id") 
我有一个自引用实体,Jackson在无限循环中对其进行引用。
虽然问题中的属性是暂时的,但Jakson仍在尝试序列化并给出问题。

可能您可以在类上方使用
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class,property=“id”)
。或者,您可以在List类上方编写自定义序列化程序,并使用它注释List
@jsondeseserialize(using=CustomDeserializer.class)
@JsonSerialize
可能您可以在类上方使用
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class,property=“id”)
。或者,您可以在List类的上方编写自定义序列化程序,并使用它对List进行注释
@JsonDeserialize(使用=CustomDeserializer.class)
@JsonSerialize