Rest API 响应显示重复数据
RestAPI response shows duplicate data
我正在尝试编写一个具有一对多关联的简单应用程序。当我获取作者时,我在邮递员响应中多次重复数据。下面是我的实体和映射。
@Entity
public class Books extends AbstractEntity implements Serializable{
// properties
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "auther_number", referencedColumnName="auther_id")
private Author author;
// get/set goes here.
}
@Entity
public class Author extends AbstractEntity implements Serializable{
// properties for autherID, name etc.
@OneToMany(mappedBy = "author",cascade = CascadeType.ALL,orphanRemoval = true, fetch = FetchType.LAZY)
private List<Books> bookList;
// to avoid synchronization issues. in 1-M Bi-direactional
public void addBooks(Books book) {
booklist.add(book);
book.setAuther(this);
}
// to avoid synchronization issues. in 1-M Bi-direactional
public void removeBooks(Books book) {
booklist.remove(book);
book.setAuthor(null);
}
// equals and hashcode methods
}
AutherserviceImpl.java
@Override
public List<Author> getAllAuthors() {
List<Author> authorList = (list<Author>) authorRepo.findAll();
return authorList ;
}
休息控制器
@GetMapping("/api/authors")
public ResponseEntity<Object> findAllAuthors(){
return new ResponseEntity<>(autherserviceImpl.getAllAuthors(),
HttpStatus.OK);
}
下面是邮递员的输出。为什么会重复?我已经按照 this.
给出的示例进行操作
"authorNo": 4575600302,
"balance": 4458.0,
"books": [
{
"bookID": 3522,
"price": 458.0,
"ISBN": "1234",
"author": {
"authorNo": 4575600302,
"balance": 4458.0,
"books": [
{
"bookID": 3522,
"price": 458.0,
"ISBN": "1234",
"author": {
"authorNo": 4575600302,
"balance": 4458.0,
"books": [
{
"bookID": 3522,
"price": 458.0,
"ISBN": "1234",
"author": {
"authorNo": 4575600302,
"balance": 4458.0,
"books": [
{
Whosebug 中的一些问题建议使用 Set 而不是列表。但是当我使用 Set 时,我在 Set 和 List 之间遇到了转换错误。不确定修复铸造错误的确切位置。因为我没有看到任何堆栈跟踪,但仅在邮递员响应中我收到了该错误。
如何解决这个重复数据显示问题?注意数据库中没有重复的记录。
问题不在于 JPA,而在于 Jackson 对 author 实例的序列化。作者和书籍之间存在双向关系,即 Jackson 序列化一个作者的所有书籍,当它序列化一本书时,它会再次开始序列化相应作者的过程。
最简单的解决方案是将Books
的字段author
注释为@JsonIgnore
。或者,您可以将 author
注释为 @JsonManagedReference
,将 Author
的字段 bookList
注释为 @JsonBackReference
。那么,反序列化循环应该就被打破了。
详细指南请看这里:https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion
我正在尝试编写一个具有一对多关联的简单应用程序。当我获取作者时,我在邮递员响应中多次重复数据。下面是我的实体和映射。
@Entity
public class Books extends AbstractEntity implements Serializable{
// properties
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "auther_number", referencedColumnName="auther_id")
private Author author;
// get/set goes here.
}
@Entity
public class Author extends AbstractEntity implements Serializable{
// properties for autherID, name etc.
@OneToMany(mappedBy = "author",cascade = CascadeType.ALL,orphanRemoval = true, fetch = FetchType.LAZY)
private List<Books> bookList;
// to avoid synchronization issues. in 1-M Bi-direactional
public void addBooks(Books book) {
booklist.add(book);
book.setAuther(this);
}
// to avoid synchronization issues. in 1-M Bi-direactional
public void removeBooks(Books book) {
booklist.remove(book);
book.setAuthor(null);
}
// equals and hashcode methods
}
AutherserviceImpl.java
@Override
public List<Author> getAllAuthors() {
List<Author> authorList = (list<Author>) authorRepo.findAll();
return authorList ;
}
休息控制器
@GetMapping("/api/authors")
public ResponseEntity<Object> findAllAuthors(){
return new ResponseEntity<>(autherserviceImpl.getAllAuthors(),
HttpStatus.OK);
}
下面是邮递员的输出。为什么会重复?我已经按照 this.
给出的示例进行操作"authorNo": 4575600302,
"balance": 4458.0,
"books": [
{
"bookID": 3522,
"price": 458.0,
"ISBN": "1234",
"author": {
"authorNo": 4575600302,
"balance": 4458.0,
"books": [
{
"bookID": 3522,
"price": 458.0,
"ISBN": "1234",
"author": {
"authorNo": 4575600302,
"balance": 4458.0,
"books": [
{
"bookID": 3522,
"price": 458.0,
"ISBN": "1234",
"author": {
"authorNo": 4575600302,
"balance": 4458.0,
"books": [
{
Whosebug 中的一些问题建议使用 Set 而不是列表。但是当我使用 Set 时,我在 Set 和 List 之间遇到了转换错误。不确定修复铸造错误的确切位置。因为我没有看到任何堆栈跟踪,但仅在邮递员响应中我收到了该错误。
如何解决这个重复数据显示问题?注意数据库中没有重复的记录。
问题不在于 JPA,而在于 Jackson 对 author 实例的序列化。作者和书籍之间存在双向关系,即 Jackson 序列化一个作者的所有书籍,当它序列化一本书时,它会再次开始序列化相应作者的过程。
最简单的解决方案是将Books
的字段author
注释为@JsonIgnore
。或者,您可以将 author
注释为 @JsonManagedReference
,将 Author
的字段 bookList
注释为 @JsonBackReference
。那么,反序列化循环应该就被打破了。
详细指南请看这里:https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion