杰克逊:JsonBackReference-无限递归问题

时间:2019-01-16 12:35:55

标签: java json spring serialization jackson

我对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...

这是设计较差的,但是我没有选择更改模型的选项。

我试图通过使用JsonManagedReferenceJsonBackReference来解决这个问题。

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]] p

如果删除@JsonManagedReference注释并保留BackReference,则可以序列化对象。但是,序列化对象将Book中的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表包含对该书的一个不可为null的引用。

谢谢

1 个答案:

答案 0 :(得分:1)

看起来像您的注释在错误的位置。

为什么在阻止LibraryManagedReference之间进行递归的同时,Author拥有Book的图书?

这可能是应该的方式:

public class Author {
    @JsonBackReference
    private Book book;
}

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

此外,肯定存在错误的模型,Author与一本书具有一对一的关系。逻辑上,Author可能拥有许多books