如何用Lombok实现toString仅展示嵌套对象id并避免栈溢出?
用Lombok实现嵌套对象toString仅展示ID的方案
由于Human和Pet类互相引用,Lombok的@Data自动生成的toString会递归调用对方的toString方法,最终导致java.lang.StackOverflowError。不需要手动编写完整的toString方法,通过Lombok的注解组合就能实现需求:嵌套调用时仅展示关联对象的ID,单独调用时显示对象的完整字段(含关联对象ID)。
修改后的代码示例
Human类
@Data public class Human { private long id; @ToString.Exclude private Pet pet; // 其他属性... @ToString.Include(name = "pet") public Long getPetId() { return pet != null ? pet.getId() : null; } }
Pet类
@Data public class Pet { private long id; @ToString.Exclude private Human owner; // 其他属性... @ToString.Include(name = "owner") public Long getOwnerId() { return owner != null ? owner.getId() : null; } }
注解说明
@ToString.Exclude:标记原嵌套字段,让Lombok生成toString时忽略该字段,避免递归调用@ToString.Include(name = "pet"):指定新增的getPetId方法在toString输出中以原字段名"pet"展示,输出内容为关联对象的ID而非完整对象
最终效果:
- 调用
human.toString()会得到类似Human(id=1, pet=2)的结果 - 调用
pet.toString()会得到类似Pet(id=2, owner=1)的结果 - 既避免了栈溢出问题,又保留了Lombok自动生成其他字段
toString的便利性
内容的提问来源于stack exchange,提问作者Czachodym
相关产品推荐
相关产品推荐

