我使用的是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;
}
如果我只想得到作者,这个设置很好,因为书已经就位,他们的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"
}
}
对这件事有任何想法都会很棒!谢谢
如果你想从两边序列化引用(Book,Author(,那么jackson就会面临循环引用的问题,在序列化这两个对象中的一个时,它会陷入引用的无休止循环中。
解决方法是使用@JsonManagedReference
和@JsonBackReference
,其中jackson忽略了一侧,只序列化了另一侧,以避免循环引用。
问题的解决方案(当你想序列化双方时(是创建单独的DTO对象(AuthorDto,BookDto(,而不是从你的控制器返回一个要序列化的Author,而是返回一个AuthorDdo。与Book相同。然后循环引用问题不再存在,双方都将有问题的引用序列化。
DTO是在更复杂的场景中进行的方法,尤其是在入站端。为了对更简单的用例进行动态过滤,我为jackson编写了一个使用antpath风格过滤的插件。也许它对你有帮助:
https://github.com/Antibrumm/jackson-antpathfilter
您在ManyToOne关系端添加了fetch类型,如下所示。
要获取所有图书实体,请添加获取类型Eagle。
@ManyToOne(fetch=FetchType.EAGER,可选=错误)
若要仅获取图书实体,请添加"获取惰性"。
@ManyToOne(fetch=FetchType.LAZY,可选=错误)