我已经使用@JsonIdentityInfo
解析了JSON递归循环到Baeldung的博客1(谢谢)
但现在又出现了另一个错误:
Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.mezoo.tdc.model.Payment.toString()
这是我的注册对象:
@Entity
@Table(name="Registration")
@JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "uuid")
public class Registration implements Serializable {
/*some private variables..*/
// Bidirectional relationship
@OneToMany(mappedBy="registration", cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE}, fetch = FetchType.LAZY)
private List<Payment> payment;
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("payment", payment)
.toString();
}
}
现在,付款对象:
@Entity
@Table(name="Payment")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "uuid")
public class Payment implements Serializable {
@ManyToOne
@JoinColumn(name = "registration")
private Registration registration;
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("registration", registration)
.toString();
}
}
这就是我在调试器中看到的内容:
请问,有什么不对,为什么?
答案 0 :(得分:4)
好吧,我的猜测是Registration.toString()
打印列表中每笔付款的字符串表示形式,由于Payment.toString()
包含Registration
的字符串表示形式,因此调用Registration.toString()
再次,再次调用Payment.toString()
,依此类推。
尝试在Payment.toString()
中返回一个空字符串,以查看问题是否消失。
答案 1 :(得分:2)
删除toString
方法。
如果您使用的是龙目岛:
使用 lombok 中的@Data
注释检查您的实体/ DAO类,默认情况下,该注释包括getter和setter。如有需要,请将其更改为@Getters
和@Setter
,并删除@Data
注释。
答案 2 :(得分:0)
在您的Registration.toString()
中,您呼叫Payment.toString()
;在您的Payment.toString()
中,您呼叫Registration.toString()
您已经在toString中创建了一个循环
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("payment", payment) //<----------- REMOVE THIS
.toString();
}
或
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("registration", registration) //<----------- REMOVE THIS
.toString();
}
或更妙的是,将它们都删除