java - 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...
这设计得很糟糕,但我没有更改模型的选项。
我试图利用JsonManagedReference
and来解决这个问题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
. 但是,序列化对象将Book
instance 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 表包含对该书的不可为空的引用。
谢谢
解决方案
看起来你的注释在错误的地方。
为什么Library
在防止andManagedReference
之间递归时使用书籍?Author
Book
这大概就是它应该的样子:
public class Author {
@JsonBackReference
private Book book;
}
public class Book {
@JsonManagedReference
private List<Author> authors = new ArrayList<Author>();
}
此外,肯定有一个错误的模型Author
与一本书有一对一的关系。逻辑上一个Author
可以拥有很多books
。
推荐阅读
- vba - 如何在 VBA ListBox 中设置列标题和格式列?
- python - 根据数据框可能包含的较小字符串过滤数据框的字符串值
- python - Python Flask 应用程序的应用引擎灵活环境问题
- mysql - 带有触发器的 MySQL 错误 #1054“字段列表中的未知列”
- r - ggplot如何在R中垂直而不是水平“读取”数据
- dax - SSAS DAX 总计与实际总和不匹配
- javascript - React Native 尝试将坐标传递给折线得到错误:NSNumber 无法转换为 NSDictionary
- console.log - 如何在至少 2 行的箭头函数中插入 console.log
- docker - 如何将 NGINX 代理网络设置为 wikijs 正确?
- java - JPA多对多级联问题