lombok注解编译报错主因是ide未启用注解处理器,需手动开启;@data不生成构造器,与@builder合用时需显式添加@allargsconstructor等;继承场景下@data不处理父类字段,须用@equalsandhashcode(callsuper=true);dto中误用@data易致json序列化异常,推荐@getter+@setter配合@jsonproperty精确控制。

为什么加了@Data还是编译报错“cannot find symbol”
常见原因是Lombok注解没被编译器识别,不是代码写错了。IDE(如IntelliJ)默认不启用注解处理器,即使装了插件,也要手动开启:
– 进入 Settings → Build → Compiler → Annotation Processors,勾选 Enable annotation processing;
– Maven项目还需确认 pom.xml 中 lombok 依赖 scope 是 provided 或未指定(不能是 test);
– Gradle用户容易漏掉 annotationProcessor 配置,得显式声明:annotationProcessor 'org.projectlombok:lombok'。
@Data和@Builder一起用时,为什么build()方法不生效
@Data 自动生成 toString()、equals()、hashCode()、所有字段的 getter/setter,但它**不生成构造器**;而 @Builder 默认依赖无参构造器或全参构造器。若字段有 @NonNull 或用了 @RequiredArgsConstructor,又没配 @AllArgsConstructor,build() 就可能因找不到合适构造器而失效。
实操建议:
– 显式加 @AllArgsConstructor 或 @RequiredArgsConstructor;
– 更稳妥的做法是直接用 @Builder + @NoArgsConstructor + @AllArgsConstructor 组合;
– 注意:@Builder 会覆盖 @Data 生成的 setter,所以 builder 模式下不要混用 setXxx() 和 xxx(xxx) 链式调用。
实体类继承父类时,@Data无法正确生成equals()/hashCode()
Lombok 的 @Data 默认只处理当前类字段,不会自动包含父类字段——这会导致子类 equals() 比较时忽略父类属性,逻辑出错。
解决方案只有两个:
– 改用 @EqualsAndHashCode(callSuper = true) 单独控制;
– 或彻底放弃 @Data,拆成 @Getter + @Setter + @ToString + @EqualsAndHashCode(callSuper = true) + @RequiredArgsConstructor,更可控;
– 切记:Lombok 不支持跨类生成带父类字段的全参构造器,父类字段初始化仍需手动处理或靠 @SuperBuilder(但要求父类也用该注解)。
在DTO或响应类中误用@Data引发JSON序列化问题
Spring Boot 默认用 Jackson,而 @Data 生成的 getter/setter 若字段名含下划线(如 user_name),Jackson 会按驼峰规则映射为 userName,导致前端收不到预期字段。
常见应对方式:
– 用 @JsonProperty("user_name") 修饰字段或 getter;
– 或统一改用 @Accessors(fluent = true)(慎用,会影响整个类风格);
– 更推荐做法:DTO 类不用 @Data,只加 @Getter + @Setter,再用 @JsonAlias 或 @JsonProperty 精确控制序列化行为;
– 另外,@Data 会把 static 字段也塞进 toString(),容易泄露敏感信息或引发 NPE,记得用 @ToString.Exclude 排除。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










