有没有办法让“@JsonBackReference”只在元素在集合中时起作用,而在独立时不起作用?

问题描述

我正在使用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 样式过滤。可能对你有帮助:

https://github.com/Antibrumm/jackson-antpathfilter