Получение StackOverflowError при попытке получить объект из базы данных

Это мой класс сущности

@Entity
@Data
@Table(name = "wishlist")
public class Wishlist {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @OneToOne(targetEntity = Customer.class, fetch = FetchType.EAGER)
    @JoinColumn(nullable = false,name = "customer_id")
    private Customer customer;

    @Column(name = "created_date")
    private Date createdDate;

    @ManyToOne
    @JoinColumn(name = "product_id")
    private Products product;

    public Wishlist(Customer customer, Products product) {
        this.customer = customer;
        this.createdDate = new Date();
        this.product = product;
    }
    
    public Wishlist() {
        
    }
}

Это мой репозиторий

public interface WishlistRepository extends JpaRepository<Wishlist, Integer> {
    List<Wishlist> findAllByCustomerIdOrderByCreatedDateDesc(Integer customerId);
    Optional<Wishlist> findByProductId(Integer productId);
}

Это мой сервисный слой

@Service
@Transactional
public class WishlistServiceImpl implements WishlistService{

    @Autowired
    WishlistRepository wishlistRepo;

    @Override
    public void createWishlist(Wishlist wishlist,Integer productId) throws ProductNotExistsException {
        Optional<Wishlist> optionalProduct = wishlistRepo.findByProductId(productId);
        System.out.println(optionalProduct)
    }
}

Поэтому я пытаюсь проверить, присутствует ли продукт в моем списке желаний или не используется идентификатор продукта.

Но получаю ошибку:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.StackOverflowError] with root cause

java.lang.StackOverflowError: null
    at java.base/java.lang.AbstractStringBuilder.putStringAt(AbstractStringBuilder.java:1720) ~[na:na]
    at java.base/java.lang.AbstractStringBuilder.putStringAt(AbstractStringBuilder.java:1724) ~[na:na]
    at java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:583) ~[na:na]
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:175) ~[na:na]
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:87) ~[na:na]
    at java.base/java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:112) ~[na:na]
    at java.base/java.lang.StringBuilder.<init>(StringBuilder.java:127) ~[na:na]
    at com.ecommerce.entity.Customer.toString(Customer.java:29) ~[classes/:na]

Итак, как решить эту проблему?

Покажите нам свой метод toString() для Customer, Product и Wishlist.

Manuel 29.11.2022 07:07

Для клиентов, продуктов и списка пожеланий я использую @Data

Pritam Das 29.11.2022 07:11

Не используйте @Data с сущностями JPA, потому что toString равно и hashCode вызовет эту проблему.

Simon Martinelli 09.12.2022 11:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

может быть проблема с циклическими зависимостями.

попробуйте добавить следующую аннотацию:

@ToString.Exclude

или попробуйте переопределить реализацию toString.

В частности, где я должен дать аннотацию

Pritam Das 29.11.2022 07:47

@PritamDas в ваших классах сущностей в этом случае, или вы можете переопределить метод toString() своей собственной реализацией.

Pavan 29.11.2022 07:49
Ответ принят как подходящий

У вас есть циклическая зависимость между продуктом и списком пожеланий.

@Data объединяет функции @ToString, @EqualsAndHashCode, @Getter/@Setter и @RequiredArgsConstructor вместе.

Вы можете либо исключить поля из hashcode и equals с помощью @EqualsAndHashCode.Exclude (см. дополнительную информацию в введите описание ссылки здесь, либо вы можете заменить @Data на @Getter и @Setter.

Другие вопросы по теме