我对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...
这是设计较差的,但是我没有选择更改模型的选项。
我试图通过使用JsonManagedReference
和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]] 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的引用。
谢谢
答案 0 :(得分:1)
看起来像您的注释在错误的位置。
为什么在阻止Library
和ManagedReference
之间进行递归的同时,Author
拥有Book
的图书?
这可能是应该的方式:
public class Author {
@JsonBackReference
private Book book;
}
public class Book {
@JsonManagedReference
private List<Author> authors = new ArrayList<Author>();
}
此外,肯定存在错误的模型,Author
与一本书具有一对一的关系。逻辑上,Author
可能拥有许多books
。