Не могу написать JSON: бесконечная рекурсия - PullRequest
0 голосов
/ 28 января 2020

Я получаю ошибку рекурсии StackOverflow при запуске запроса в Postman или браузере.

Когда я запускаю, говорит:

.wsmsDefaultHandlerExceptionResolver: Невозможно записать JSON: бесконечная рекурсия (StackOverflowError) ; вложенное исключение: com.faster xml .jackson.databind.JsonMappingException: бесконечная рекурсия (StackOverflowError)

Вот классы моделей:

@Entity 
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotNull
    private String title;
    @NotNull
    private String description;
    @NotNull
    private double price;
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "category_id", nullable = false)
    private Category category;
    private boolean isSealed;
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "currency_id", nullable = false)
    private Currency currency;
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
    @Nullable
    @OneToMany(mappedBy = "product",
            cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Images> images;
    private Date createdDate = new Date();
    @OneToOne(fetch = FetchType.LAZY,
            cascade = CascadeType.ALL,
            mappedBy = "product")
    private View view;
    @OneToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
    @JoinColumn(name="type_id")
    private Type type;
    private Long viewCount; }
@Entity public class Images{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String imagePath;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "product_id")
    private Product product; }
@Entity public class User implements UserDetails, Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotEmpty
    private String fullName;
    @NotEmpty
    @Email
    @Column(unique = true)
    private String email;
    @NotNull
    @Column(unique = true)
    private int phoneNumber;
    @NotEmpty
    @Size(min = 5)
    private String password;
    private Date createAt = new Date();
    @Nullable
    private String picPath;
    @Nullable
    private String token;
    @ManyToMany
    @JoinTable(name = "user_roles", joinColumns = {@JoinColumn(
            name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")})
    private List<Role> roles;
    @OneToOne(fetch = FetchType.LAZY,
            cascade = CascadeType.ALL,
            mappedBy = "user")
    private Product product;
    @OneToOne(fetch = FetchType.LAZY,
    cascade = CascadeType.ALL,
    mappedBy = "user")
    private View view; }
@Entity 
public class Currency{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String code;
    private String currency;
    private String region_country;
    @OneToOne(mappedBy = "currency", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Product product; }
@Entity 
public class Category {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String imagePath;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY,
    mappedBy = "category")
    private Product product;
    @OneToMany(mappedBy = "category", fetch = FetchType.LAZY,
            cascade = CascadeType.ALL)
    private Set<Brand> brands; }
@Entity public class Brand {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "category_id", nullable = false)
    private Category category; }
@Entity public class View {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "product_id", nullable = false)
    private Product product; }
@Entity public class Type {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotNull
    private String name;
    @OneToOne(fetch = FetchType.LAZY,
            cascade = CascadeType.ALL,
            mappedBy = "type")
    private Product product; }
    @Id
    private String role;
    @ManyToMany(mappedBy = "roles")
    private List<User> users; 
}

Ответы [ 2 ]

1 голос
/ 30 января 2020

Более чем одна из ваших сущностей имеет друг друга в себе. Например, Product имеет объект User, а User имеет объект Product.

Чтобы решить эту проблему, вы должны написать

@JsonBackReference(value = "user-product")
private User user;

в класс Product и

@JsonManagedReference(value = "user-product")
private Product product;

В классе user. Сделайте это в каждом поле и для каждого класса, который вызывает друг друга.

Кроме того, проверьте это JPA: наличие списков на обоих концах без бесконечного l oop

0 голосов
/ 28 января 2020

У вас есть циклы в вашей модели данных. Например, Product содержит Images, а Images указывают на Products.

. Это работает в объектно-ориентированном мире, поскольку в этих полях хранятся только ссылки на указатели.

Однако при сериализации фактический объект записывается в виде json текста. Ваш Product печатает объект Images, который, в свою очередь, печатает объект Product, который снова печатает объект Image и так далее.

Вам нужно решить, как вы хотите представить свой json, отобразить модель базы данных в простой простой старый объект java и использовать его для сериализации. Эти POJO часто называют Просмотр модели или Транспортные объекты .

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