Lombok toString StackOverflowError

观察如下错误日志,可以发现几个不断重复关键字:StackOverflowError toString ModelPlanningDetail.java:12和ModelPlanning.java:16

java.lang.StackOverflowError
    at sun.util.locale.provider.TimeZoneNameUtility.retrieveDisplayNamesImpl(TimeZoneNameUtility.java:147)
    at sun.util.locale.provider.TimeZoneNameUtility.retrieveDisplayName(TimeZoneNameUtility.java:137)
    at java.util.TimeZone.getDisplayName(TimeZone.java:400)
    at java.util.Date.toString(Date.java:1045)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.gome.tccb.planning.domain.ModelPlanningDetail.toString(ModelPlanningDetail.java:12)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.gome.tccb.planning.domain.ModelPlanning.toString(ModelPlanning.java:16)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at com.gome.tccb.planning.domain.ModelPlanningDetail.toString(ModelPlanningDetail.java:12)

异常定位到@Data注解,猜测可能是由于使用lombok自动生成toString的原因。


image.png

image.png

后经谷歌才明白,原来是因为两个类相互引用了,A类中有个B类的引用,B类中也有个A类的引用,所以当调用A实例的toString方法时,会通过B的引用调用B的toString方法,而在B调用toString方法时,因为B包含A的引用,所以又调用A的toString...由此形成了一个环,循环递归调用,最终StackOverflowError了。

解决方法

@ToString(exclude = {"modelPlanning"}) // 忽略本类中modelPlanning的toString方法

你可能感兴趣的:(Lombok toString StackOverflowError)