有两种方法可以解决此问题。如果您必须将实体暴露给外界,建议添加
@JsonIgnore导致循环引用的属性。这将告诉杰克逊不要序列化该属性。
另一种方法是使用Jackson提供的双向功能。您可以使用
@JsonManagedReference或
@JsonBackReference。
@JsonManagedReference是属性的“转发”部分,它将正常序列化。
@JsonBackReference是参考的“背面”部分;它不会被序列化,但是当“
forward”类型被反序列化时将被重建。
您可以在此处查看示例。
这可以解决您的评论:我想在这种情况下,您可能想使用对外界可见的DTO。我喜欢这种方法,因为我不想将实体暴露在外面。这意味着Jackson注释将在DTO上而不是在实体上。您将需要某种将实体转换为DTO的映射器或转换器。现在,当您对实体进行更改时,除非您修改了映射器/转换器,否则它们不会传播到DTO。我认为这是可以的,因为当您对实体进行更改时,您可以决定是否希望该更改公开。
更新
这是一个很好的博客文章在这里是进入你能处理杰克逊双向关系的各种方式的细节。它描述的解决方案,使用
@JsonIgnore,
@JsonManagedReference和
@JsonBackReference,
@JsonIdentityInfo,
@JsonView和自定义序列为好。这是您可以使用的各种技术的非常全面的文章。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)