问题描述
我正在使用fasterxml,并且我有两个具有“一对多”或“多对一”关系的对象。例如类 Author 和类 Book,一个作者有很多本书,一本书有一个作者。我可以告诉fasterxml不要连载这本书的作者,只有当这本书在它的作者的书籍收藏中时,但当这本书在它本身上时,才连载它。
作者类:
public class Author{
public int id;
public string name;
@JsonManagedReference
public Set<Book> books;
}
图书类:
public class Book{
public int id;
public string name;
@JsonBackReference
public Author author;
}
如果我只想获取作者,该设置就可以正常工作,因为书籍已经就位,并且他们的作者属性没有被序列化,但是如果我只想序列化这本书,它的作者又没有被序列化序列化,因为“@JsonBackReference”注释。在上述情况下有什么解决方法吗?如果您没有理解我的意思,这里还有一些示例...
当我序列化一个 Autor 时:
{
id:3,name: "Ivan Vazov"
books:[
{
id:5,name: "Under the Yoke"
}
]
}
这就是我想要的。
当我连载一本书时:
{
id:5,name: "Under the Yoke"
}
但我不想要这个,我想要这个:
{
id:5,name: "Under the Yoke",author: {
id:3,name: "Ivan Vazov"
}
}
对此事的任何想法都会很棒!谢谢。
解决方法
您在 ManyToOne 关系端添加了 fetch 类型,如下所示。
要获取所有图书实体,请添加获取类型 Eager。
@ManyToOne( fetch = FetchType.EAGER,可选 = 假 )
要只获取图书实体,然后添加懒加载。
@ManyToOne( fetch = FetchType.LAZY,可选 = 假 )
,如果您希望从双方(书籍、作者)对引用进行序列化,那么 jackson 将面临循环引用的问题,即在序列化这两个对象之一时,它会陷入无休止的引用循环中。
解决方法是使用 @JsonManagedReference
和 @JsonBackReference
,其中 jackson 忽略了一侧并仅序列化另一侧以避免循环引用。
您的问题的解决方案(当您想要序列化双方时)是创建单独的 DTO 对象(AuthorDto、BookDto),而不是从控制器返回要序列化的作者,而是返回 AuthorDto。与书相同。那么循环引用问题就不存在了,双方将有问题的引用序列化。
,DTO 是处理更复杂场景的方法,尤其是在入站方面。对于更简单用例的动态过滤,我为 jackson 编写了一个插件来使用 antpath 样式过滤。可能对你有帮助: