@Data不能直接加在继承链顶层类上,因其生成的equals()和hashCode()默认忽略父类字段,导致子类实例比较出错;正确做法是父类用@Getter+@Setter、子类加@Data,或统一加@EqualsAndHashCode(callSuper=true)。

为什么 @Data 不能直接加在继承链顶层类上
因为 @Data 自动生成的 equals() 和 hashCode() 默认只比较本类字段,父类字段被忽略,导致子类实例间比较出错。比如父类 BaseEntity 有 id,子类加了 @Data 后,两个不同 id 的子类对象可能被判定为相等。
- 正确做法:父类用
@Getter+@Setter,子类再加@Data;或统一用@EqualsAndHashCode(callSuper = true)显式包含父类字段 - 注意
@Data会覆盖已存在的toString()、getter等方法,如果父类已手动实现,编译会报错 - IDE 可能不提示冲突,但运行时
lombok注解处理器会在编译期注入,出错往往在打包后才暴露
@Builder 和构造函数冲突时怎么选参数顺序
@Builder 默认生成无参构造器 + 静态内部类,但如果类已有全参构造器(尤其用了 @AllArgsConstructor),Lombok 会跳过生成默认构造器,导致 Spring 依赖注入失败。
- 常见错误现象:
org.springframework.beans.factory.BeanCreationException,提示“no default constructor” - 解决方式:显式加
@NoArgsConstructor,或改用@Builder(builderMethodName = "of")避免和构造器名冲突 - 参数顺序以字段声明顺序为准,不是注解书写顺序;若需调整,只能改字段定义顺序或手写
build()方法 - Spring Boot 3+ 默认要求无参构造器,
@Builder单独使用不够,必须配合@NoArgsConstructor
日志相关注解如 @Slf4j 在模块化项目中为啥不生效
因为 @Slf4j 生成的是 private static final org.slf4j.Logger log = ...,而 JDK 9+ 模块系统默认不导出 slf4j-api 的包,编译通过但运行时报 NoClassDefFoundError: org/slf4j/Logger。
- 确认
slf4j-api和具体实现(如slf4j-simple或logback-classic)都在runtime依赖中,不是compileOnly - Maven 多模块下,如果日志依赖只在 parent pom 声明,子模块需显式 re-declare,否则 annotation processor 找不到类
- Gradle 用户注意:
annotationProcessor配置块里也要加lombok,不能只靠implementation
如何让 Lombok 生成的代码和 IDE 提示一致
IntelliJ 默认不识别 Lombok 注解生成的 getter/setter,导致红色波浪线和自动补全失效,本质是 IDE 没启用 Lombok plugin 或未开启 annotation processing。
- 必须安装并启用 IntelliJ 的
Lombok Plugin(Settings → Plugins) - 开启 annotation processing:Settings → Build → Compiler → Annotation Processors → 勾选 “Enable annotation processing”
- 如果用了
@FieldNameConstants或@Singular,需额外勾选 “Obtain processors from project classpath” - VS Code 用户需装
lombok Annotations Support for VS Code插件,并确保 Java extension pack 版本 ≥ 0.26
Lombok 的侵入性藏在编译期——它不改变源码,但彻底绕过 IDE 的语义分析路径。最常被忽略的是构建环境一致性:本地 IDEA 能跑,CI 上却编译失败,大概率是 Gradle/Maven 的 annotationProcessor 配置漏了,或者 JDK 版本不匹配导致注解处理器静默退出。










