Spring boot 在一对多对一双向关系中,是否有可能避免递归和堆栈溢出错误?

Spring boot 在一对多对一双向关系中,是否有可能避免递归和堆栈溢出错误?,spring-boot,debugging,recursion,one-to-many,many-to-one,Spring Boot,Debugging,Recursion,One To Many,Many To One,我使用Spring Boot和Thymeleaf创建一个web应用程序 当我调试我的应用程序时,它运行得非常慢。调试器的每个F8步骤都会在我的对象上显示消息“正在收集数据…”。我很长一段时间(10-60秒)都看不到对象的状态 最后,当收集完数据后,我看到StackOverflowerError 我知道在这种情况下有一个无限递归。汽车链接到服务,服务链接到汽车,等等。它会为每个对象溢出toString()方法 我看到许多使用@OneToMany和@ManyToOne注释的示例。所有这些都会导致

我使用Spring Boot和Thymeleaf创建一个web应用程序

当我调试我的应用程序时,它运行得非常慢。调试器的每个F8步骤都会在我的对象上显示消息“正在收集数据…”。我很长一段时间(10-60秒)都看不到对象的状态

最后,当收集完数据后,我看到StackOverflowerError

我知道在这种情况下有一个无限递归。汽车链接到服务,服务链接到汽车,等等。它会为每个对象溢出
toString()
方法

我看到许多使用
@OneToMany
@ManyToOne
注释的示例。所有这些都会导致递归和堆栈溢出错误。在这种情况下,工程师建议放置
@JsonIgnore
@JsonManagedReference
/
@JsonBackReference
注释来修复无限递归

这些建议适用于RESTAPI序列化对象

问题是我没有开发restapi。我制作Web MVC应用程序

那么,你能推荐我什么来修复这个递归并拥有一个快速调试应用程序呢

这是一个糟糕的设计吗?还是别的什么


谢谢

我在调试期间没有遇到此类问题,我认为这与您的设计更相关。 但是,请尝试添加惰性,例如:

@ManyToOne(fetch = FetchType.LAZY)
这可能会有所帮助。

问题的工作解决方案:
  • 首先需要标记
    @ManyToOne(fetch=FetchType.LAZY)
    注释,以便在调试时具有更好的性能

  • 必须做的第二件事是修改标准IDE生成的
    toString
    方法。对于嵌套对象,不应返回整个对象,而应仅返回对象ID

  • 服务的示例

    修改前:

    @Override
      public String toString() {
        return "Service{" +
            "serviceId=" + serviceId +
            ", car=" + car +
            ", event='" + event + '\'' +
            ", created=" + created +
            ", modified=" + modified +
            '}';
      }
    
    @Override
      public String toString() {
        String carId;
        if (car == null) {
          carId = "null";
        } else {
          carId = car.getCarId().toString();
        }
        return "Service{" +
            "serviceId=" + serviceId +
            ", carId=" + carId +
            ", event='" + event + '\'' +
            ", created=" + created +
            ", modified=" + modified +
            '}';
      }
    
    修改后:

    @Override
      public String toString() {
        return "Service{" +
            "serviceId=" + serviceId +
            ", car=" + car +
            ", event='" + event + '\'' +
            ", created=" + created +
            ", modified=" + modified +
            '}';
      }
    
    @Override
      public String toString() {
        String carId;
        if (car == null) {
          carId = "null";
        } else {
          carId = car.getCarId().toString();
        }
        return "Service{" +
            "serviceId=" + serviceId +
            ", carId=" + carId +
            ", event='" + event + '\'' +
            ", created=" + created +
            ", modified=" + modified +
            '}';
      }
    
    现在我没有得到调试器
    “收集数据…”
    消息和
    堆栈溢出错误
    异常


    调试性能很好

    你的回答很有用。它在一定程度上帮助解决了调试期间的性能问题。谢谢