为什么使用Spring RestTemplate获取对象时Lombok注解不生效?
问题成因
- Lombok编译期处理未生效:Lombok属于编译期注解处理器,生成样板代码需要两个必备条件:一是项目构建配置中正确引入Lombok依赖与注解处理器配置,二是IDE开启了注解处理功能且安装了对应Lombok插件。缺少任意一项时,
@NoArgsConstructor、@Getter、@Setter标注不会实际生成对应方法,编译后的class文件仍只有你手动编写的全参构造,因此Jackson反序列化时会提示找不到无参构造。 - 手动补充无参构造后仍无有效Setter:你手动添加无参构造解决了实例化问题,但因为Lombok仍未生效,没有自动生成Setter方法,Jackson默认通过Setter给字段赋值,找不到对应Setter就无法完成字段注入,最终得到的对象所有字段均为空。
- 手写全量方法时所有逻辑都符合Jackson反序列化要求,因此功能正常。
修复方案
1. 完善项目Lombok配置
根据你使用的构建工具添加对应配置:
- Maven(pom.xml):
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <!-- 若使用Spring Boot父工程管理版本则无需指定版本号,否则请添加对应稳定版版本号 -->
- Gradle(build.gradle):
dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' }
2. 开启IDE注解处理
- IntelliJ IDEA:依次进入
File → Settings → Build, Execution, Deployment → Compiler → Annotation Processors,勾选Enable annotation processing后保存设置,重启IDE生效。 - Eclipse:下载对应版本Lombok插件安装后重启IDE即可自动生效。
3. 简化DTO类注解
你可以直接使用@Data注解整合@Getter、@Setter、@ToString、@EqualsAndHashCode等常用注解,同时用@AllArgsConstructor替换手动编写的全参构造,进一步减少样板代码:
@Data @NoArgsConstructor @AllArgsConstructor public class NotaryDistrict { String idDistrict; String denominazione; String regione; String provincia; ArrayList<Localita> localita; }
4. 验证生效
编译项目后,查看编译生成的NotaryDistrict.class文件,确认存在无参构造、全参构造以及所有字段对应的get/set方法,即说明Lombok配置正常,此时重新运行项目即可正常完成反序列化。
如果完成上述操作后仍有异常,可检查Lombok版本是否与当前Spring Boot版本兼容,升级到Lombok最新稳定版即可解决兼容性问题。
内容的提问来源于stack exchange,提问作者Andrea Nobili
相关产品推荐
相关产品推荐

