Spring boot JSON возвращает бесконечные вложенные объекты - PullRequest
2 голосов
/ 02 марта 2020

В моем коде есть следующее:

CompanyEntity

@Entity
@Table(name = "company")
public class Company{
   @OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
   @JsonUnwrapped
   private Set<User> users;
}

UserEntity

@Entity
@Table(name="user")
public class User{
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name="company_id")
    private Company company;
}

CompanyController

@GetMapping("/company")
public ResponseEntity<Object> getAllCompanies(){
    List<Company> allCompanies = companyService.findAll();
    return ResponseEntity.ok(allCompanies);

}

проблема заключается в том, когда я вызываю /company в браузере и получаю объект users, включая объект компании. что-то вроде этого

[
    {
        "id": 1,
        "name": "company",
        "users": [
            {
                "id": 14,
                "firstName": "Yamen",
                "lastName": "Nassif",
                "company": {
                    "id": 1,
                    "name": "company",
                    "users": [
                        {
                            "id": 14,
                            "firstName": "Yamen",
                            "lastName": "Nassif",
                            "company": {
                                "id": 1,
                                "name": "company",
                                "users": [

...

то же самое происходит, когда я расширяю возможности компаний и пользователей.

моя база данных выглядит просто отлично.

и его бесконечная и, конечно же, ошибка Stackoverflow находится в консоли. Как я могу это исправить?

1 Ответ

2 голосов
/ 02 марта 2020

У вас есть эта ошибка из-за бесконечной рекурсии.

Company имеет ссылку на User, а User имеет ссылку на Company.

. как минимум две опции:

  • использовать @ JsonManagedReference и @ JsonBackReference аннотацию к полям отношения.
  • создать пару DTO и заполнить их вручную с данными от ваших лиц.

например,

@GetMapping("/company")
public ResponseEntity<Object> getAllCompanies() {
    List<Company> allCompanies = companyService.findAll();
    List<CompanyDto> allCompanyDtoList = convertToCompanyDtoList(allCompanies);
    return ResponseEntity.ok(allCompanyDtoList );
}

Лично я предпочел бы второй вариант, поскольку возвращение сущностей НЕ хорошая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...