@data 生成的 tostring() 栈溢出是因为默认递归打印所有字段,遇双向引用(如 user↔order)导致死循环;需用 @tostring(exclude = "...") 显式排除引用字段。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

为什么 @Data 生成的 toString() 会栈溢出?
因为 Lombok 默认递归打印所有字段,遇到双向引用(比如 User 持有 Order,Order 又持有 User)就死循环。不是注解写错了,是默认行为没考虑对象图闭环。
- 用
@ToString(exclude = "order")或@ToString(exclude = {"orders", "parent"})主动排除引用字段 - 如果字段是集合且含双向对象,别只 exclude 字段名,还要确认集合里每个元素是否也加了 exclude —— 否则编译期不报错,运行时才炸
-
@Data是快捷键,但等价于@ToString+@EqualsAndHashCode+@Getter+@Setter+@RequiredArgsConstructor,它不智能跳过循环引用,得你手动干预
为什么加了 @Builder 却提示 “no constructor”?
Lombok 的 @Builder 默认依赖无参构造器或全参构造器;如果你加了 @RequiredArgsConstructor 或手写了带参构造,又没留无参构造,@Builder 就找不到入口。
- 最稳解法:显式加
@NoArgsConstructor(哪怕类里已有其他构造器) - 或者改用
@Builder(builderMethodName = "builder")+@AllArgsConstructor,但要注意字段顺序必须和构造器参数严格一致,否则构建时字段赋值错位 - IDE(如 IntelliJ)可能缓存旧的 Lombok 生成代码,改完注解后要
Build → Rebuild Project,否则错误提示不消失
@EqualsAndHashCode 在继承场景下怎么不崩?
子类用 @EqualsAndHashCode 默认只算自己字段,父类字段被忽略 —— 看似省事,实则破坏对称性:child.equals(parent) 和 parent.equals(child) 可能返回不同结果,违反 equals 合约。
- 若父类已用
@EqualsAndHashCode,子类必须写@EqualsAndHashCode(callSuper = true) - 若父类没用 Lombok 注解、而是手写 equals,子类仍需
callSuper = true,否则 Lombok 生成的逻辑不会调用父类方法 - 一旦启用
callSuper = true,务必确保父类的hashCode()和equals()实现是可靠的 —— 很多老项目父类只重写了toString(),这时候开callSuper反而引入 bug
IDE 不识别 Lombok 注解,但编译能过?
这是典型插件未启用或版本不匹配。Lombok 编译靠 javac 插件,IDE 显示靠 IDE 插件,二者独立;编译成功 ≠ IDE 能解析。
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
- IntelliJ:检查
Settings → Plugins是否启用了 Lombok Plugin,并确认Settings → Build → Compiler → Annotation Processors已勾选 “Enable annotation processing” - IDEA 2022.3+ 默认禁用
javac的增量编译优化,会导致 Lombok 生成代码延迟显示 —— 临时方案是关掉 “Use compile server” 或手动触发Ctrl + Shift + O(Reload project) - Gradle 用户注意:
compileOnly 'org.projectlombok:lombok'不能少,否则 IDE 插件找不到注解类,连基础语法高亮都失效
真正麻烦的从来不是写哪个注解,而是搞清它在字节码里到底生成了什么、又在哪个环节被哪层工具链消费 —— 编译器、IDE、反编译器、序列化库,各自看的不是同一份“代码”。











