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