获取实体时发生SpringBoot StackOverflow错误

insrf1ej  于 2023-02-12  发布在  Spring
关注(0)|答案(1)|浏览(156)

我有以下问题。我是新的Spring。我已经创建了2个实体,现在使用 Postman 我想得到所有的书籍,但我一直得到StackOverflowError。
这是书本模型

package com.example.demo;

import jakarta.persistence.*;

import java.util.List;

@Entity
public class BookEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String title;
    @ManyToMany
    private List<Author> author;

    public BookEntity() {
    }

    public BookEntity(String title) {
        this.title = title;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<Author> getAuthor() {
        return author;
    }

    public void setAuthor(List<Author> author) {
        this.author = author;
    }
}

作者类模型

package com.example.demo;

import jakarta.persistence.*;

import java.util.List;

@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    @ManyToMany
    private List<BookEntity> book;

    public Author() {
    }

    public Author(String name) {
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<BookEntity> getBook() {
        return book;
    }

    public void setBook(List<BookEntity> book) {
        this.book = book;
    }
}

藏书室

package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BookRepository extends JpaRepository<BookEntity, Long> {
}

作者存储库

package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface AuthorRepository extends JpaRepository<Author, Long> {
}

图书控制器

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/books")
public class BookController {

    private final AuthorRepository authorRepository;
    private final BookRepository bookRepository;

    public BookController(AuthorRepository authorRepository, BookRepository bookRepository) {
        this.authorRepository = authorRepository;
        this.bookRepository = bookRepository;
    }

    @GetMapping
    List<BookEntity> getAllBooks() {
        return bookRepository.findAll();
    }
}

你能解释一下发生了什么事吗?我不能再往前走了.我被卡住了

2ledvvac

2ledvvac1#

这是一个常见的问题,问题是Book和Author的关系是ManyToMany,所以现在每当你访问Books时,它们都有一个Author字段,当Jackson试图添加Author时,结果发现Author中的Books也有一个Author。
我知道有两种方法可以解决这个问题,第一种是DTO,你应该创建一个类,让你的控制器显示出来,看起来像这样:

public class BookDTO {
    private long bookId;
    private String bookTitle;
    private List<AuthorDTO> authors;
// constructors getters setters

}

情况有点复杂,因为多对多,所以您需要另一个DTO的作者

public class AuthorDTO {
    private long authorId;
    private String authorName;
//constructors getters setters
}

你可以使用一个服务层来完成所有的Map。2然后你应该在你的控制器中返回BookDTO。
另一种解决方法是注解:

@ManyToMany
    @JsonManagedReference
    private List<Author> author;

以及

@ManyToMany
    @JsonBackReference
    private List<BookEntity> book;

@JsoonManaged和back References将阻止Jackson挖掘另一个实体。
另一件事是,您应该考虑在您的实体之一mappedBy,以防止创建2个表。

相关问题