java - JSON 中不存在 @OneToMany 列
问题描述
我有以下实体:
图书.java
@Entity @Data
public class Book {
@Id
private Long id;
@Column(unique = true, nullable = false)
private String title;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "book")
@JsonManagedReference
private List<Note> notes;
}
Note.java
@Entity @Data
public class Note {
@Id
private Long id;
@Column(nullable = false)
private String title;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "book_id", nullable = false)
@JsonBackReference
private Book book;
}
当我调用BookRestController时,它会返回一个 JSON,其中包含我需要的所有属性:
{
"id": 15,
"title": "A fé explicada",
"author": "Leo J. Trese",
"notes": [{
"id": 10,
"title": "Sobre o pecado mortal"
}]
}
但是当我调用NoteRestController时,缺少Book属性:
{
"id": 10,
"title": "Sobre o pecado mortal"
// missing "book" property here...
}
我究竟做错了什么?
我正在使用@OneToMany和@ManyToOne注释来声明它是一个 1-N 关系;@JsonBackReference和@JsonManagedReference具有避免无限递归的简单目的。
解决方案
当然Book
被省略了,这就是字面上@JsonBackReference
的意思
@JsonBackReference 是引用的后面部分——它将从序列化中省略。
(https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion)
解决方案就像听起来一样简单:Note
您可以创建而不是在 REST 控制器中返回一个实体(无论如何我尽量避免将实体保留为在 REST 上下文中没有任何用途的实体)一个名为 eg 的显式传输对象NoteDTO
,其中包含对一本书的引用(省略了书中的注释以不具有无限递归):
public class NoteDTO {
private Long id;
private String title;
private BookReferenceDTO book;
// getters and setters
}
public class BookReferenceDTO {
private Long id;
private String title;
// getters and setters
}
推荐阅读
- javascript - 使用 requestAnimationFrame polyfill 时是否需要清除超时?
- angular - Lodash 设置未对数组应用更新
- android - Android:RecycleView 没有被填充
- python - 在 django 中执行 ajax 代码时出现类型错误
- ios - 设置一个变量等于另一个变量加一并在swift中保存为用户默认值
- ruby - 如何找到最长的连续数字
- c++ - 带有链接的基本哈希表
- c# - 指向全局变量的指针
- javascript - 在 tensorflow.js 中设置权重的函数初始化器
- macos - BDS 异常程序终止(macOS 构建)