Spring boot 在一对多对一双向关系中,是否有可能避免递归和堆栈溢出错误?
我使用Spring Boot和Thymeleaf创建一个web应用程序 当我调试我的应用程序时,它运行得非常慢。调试器的每个F8步骤都会在我的对象上显示消息“正在收集数据…”。我很长一段时间(10-60秒)都看不到对象的状态 最后,当收集完数据后,我看到StackOverflowerError 我知道在这种情况下有一个无限递归。汽车链接到服务,服务链接到汽车,等等。它会为每个对象溢出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注释的示例。所有这些都会导致
toString()
方法
我看到许多使用@OneToMany
和@ManyToOne
注释的示例。所有这些都会导致递归和堆栈溢出错误。在这种情况下,工程师建议放置@JsonIgnore
或@JsonManagedReference
/@JsonBackReference
注释来修复无限递归
这些建议适用于RESTAPI序列化对象
问题是我没有开发restapi。我制作Web MVC应用程序
那么,你能推荐我什么来修复这个递归并拥有一个快速调试应用程序呢
这是一个糟糕的设计吗?还是别的什么
谢谢我在调试期间没有遇到此类问题,我认为这与您的设计更相关。 但是,请尝试添加惰性,例如:
@ManyToOne(fetch = FetchType.LAZY)
这可能会有所帮助。问题的工作解决方案:
@ManyToOne(fetch=FetchType.LAZY)
注释,以便在调试时具有更好的性能
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 +
'}';
}
现在我没有得到调试器“收集数据…”
消息和堆栈溢出错误
异常
调试性能很好 你的回答很有用。它在一定程度上帮助解决了调试期间的性能问题。谢谢