首页 > 解决方案 > Jackson:JsonBackReference - 无限递归问题

问题描述

我对 JSON 的了解是有限的,所以希望你能指出我正确的方向。

我正在尝试发布一个对象(库),但这会由于无限递归而引发异常

public class Library{
    private List<Book> books= new 
    ArrayList<Book>();
    //omitting rest of attributes, constructor, 
   and getter/setters
}

public class Book{
    private List<Author> authors= new 
    ArrayList<Author>();
    //omitting rest of attributes, constructor, 
    and getter/setters
}

public class Author{
    private Book book;
    //omitting rest of attributes, constructor, 
    and getter/setters
}

如您所见,这会导致无法序列化的无限递归:

Library -> Book -> Author -> Book -> Author...

这设计得很糟糕,但我没有更改模型的选项。

我试图利用JsonManagedReferenceand来解决这个问题JsonBackReference

public class Library{
    @JsonManagedReference(value="book")
    private List<Book> books= new 
    ArrayList<Book>();
    //omitting rest of attributes, constructor, 
   and getter/setters
}

public class Author{
    @JsonBackReference(value="book")
    private Book book;
    //omitting rest of attributes, constructor, 
    and getter/setters
}

但是,这不起作用,我收到错误:

原因:java.lang.IllegalArgumentException:无法处理托管/反向引用“书”:从类型 [集合类型;未找到反向引用属性;类 java.util.List,包含 [简单类型,类 .......model.Book]]

如果我删除@JsonManagedReference注释并保留BackReference. 但是,序列化对象将Bookinstance in设置Author为 null,导致尝试将其持久化到数据库中时出现异常。

我是否将注释放置在正确的位置?有什么建议么?

编辑:正如回复中所建议的,我的注释被错误地放置了。以下作品用于序列化对象,但 Author 正在失去对 Book 的引用

public class Book{
@JsonManagedReference
private List<Author> authors= new 
ArrayList<Author>();
}

public class Author{
@JsonBackReference
private Book book;
}

这解决了无限递归的问题。但是,我得到 SQL 异常,因为无法插入空值。

Library -> Book -> Author X Book

author 表包含对该书的不可为空的引用。

谢谢

标签: javajsonspringserializationjackson

解决方案


看起来你的注释在错误的地方。

为什么Library在防止andManagedReference之间递归时使用书籍?AuthorBook

这大概就是它应该的样子:

public class Author {
    @JsonBackReference
    private Book book;
}

public class Book {
    @JsonManagedReference
    private List<Author> authors = new ArrayList<Author>();
}

此外,肯定有一个错误的模型Author与一本书有一对一的关系。逻辑上一个Author可以拥有很多books


推荐阅读