【问题标题】:Is there a way to get "@JsonBackReference" only working when the element is in a collection, but not when standalone?有没有办法让“@JsonBackReference”仅在元素位于集合中时才起作用,但在独立时不起作用?
【发布时间】:2021-06-25 23:11:37
【问题描述】:

我正在使用fastxml,并且我有两个具有“一对多”或“多对一”关系的对象。例如 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"
    }
}

关于此事的任何想法都会很棒!谢谢。

【问题讨论】:

    标签: json spring hibernate serialization fasterxml


    【解决方案1】:

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

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

    您的问题的解决方案(当您想要序列化双方时)是创建单独的 DTO 对象(AuthorDto、BookDto),而不是从您的控制器返回要序列化的作者,而是返回一个 AuthorDto。与书相同。那么循环引用问题就不存在了,双方对有问题的引用进行序列化。

    【讨论】:

    • 感谢您的回答!当然 DTO-s 是行业选择(经过数小时的研究,我使用过),但在某些情况下,我有大型数据库,有很多模型可供使用,而且因为我很懒,我不创建 DTO对于每一个将要被序列化的。出于这个原因,我想知道杰克逊是否有防止反向引用的动态方法。
    【解决方案2】:

    您已在 ManyToOne 关系端添加获取类型,如下所示。

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

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

    要仅获取书籍实体,然后添加 fetch lazy。

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

    【讨论】:

    • 感谢您的回答!我已经这样做了,但它不起作用。 :(
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢,一定会去看看!
    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2016-04-08
    • 2023-03-28
    相关资源
    最近更新 更多