有没有办法让“@JsonBackReference”仅在元素处于 collection 时起作用,但在独立时不起作用?

Is there a way to get "@JsonBackReference" only working when the element is in a collection, but not when standalone?

我正在使用 fasterxml,我有两个 objects 具有“一对多”或“多对一”关系。例如 class 作者和 class 书,一个作者有很多书,一本书有一个作者。我可以告诉 fasterxml 不要序列化这本书的作者,只有当这本书在它的作者的书中时 collection,但是当这本书在它自己身上时,才序列化它。

作者 class:

public class Author{

    public int id;

    public string name;

    @JsonManagedReference
    public Set<Book> books;

}

图书class:

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 关系端添加提取类型,如下所示。

要获取所有图书实体,然后添加获取类型 Eager。

@ManyToOne( 提取 = FetchType.EAGER, 可选=假 )

只获取图书实体然后添加延迟获取。

@ManyToOne( 获取 = FetchType.LAZY, 可选=假 )

如果您希望从双方(书籍、作者)序列化引用,那么 jackson 会面临循环引用的问题,在序列化这两个对象之一时,它会陷入无限的引用循环。

解决方法是 @JsonManagedReference@JsonBackReference,其中杰克逊忽略了一侧并仅序列化另一侧以避免循环引用。

你的问题的解决方案(当你想序列化双方时)是创建单独的 DTO 对象(AuthorDto,BookDto),而不是从你的控制器中 return ing a Author to be serialized you return 一个 AuthorDto。与书相同。这样循环引用问题就不存在了,双方都序列化了有问题的引用。

DTO 是在更复杂的场景中使用的方法,尤其是在入站端。对于更简单用例的动态过滤,我为 jackson 编写了一个插件以使用 antpath 样式过滤。可能对你有帮助:

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