使用Lombok的@Data与@Builder后无参构造器异常问题求助
解决JPA实体类
@Builder与无参构造器冲突问题 问题分析
你的编译错误和注解冲突问题,核心是Lombok多个注解的行为叠加导致:
编译错误根源:
@Builder会自动生成全参构造器,根据Java语法,类中存在显式构造器时,默认的无参构造器不再自动生成。- JPA的
@Entity要求实体类必须提供无参构造器用于实例化对象,因此JPA尝试创建Student实例时找不到无参构造,抛出编译错误。
添加
@NoArgsConstructor提示已定义的原因:@Data注解包含@RequiredArgsConstructor,该注解会生成包含所有final或@NonNull修饰字段的构造器。- 你的
Student类没有final或@NonNull修饰的字段,所以@RequiredArgsConstructor会自动生成一个无参构造器。此时手动添加@NoArgsConstructor,会和这个自动生成的构造器重复,编译器因此提示“无参构造器已定义”。
解决方案
在类上同时添加@NoArgsConstructor和@AllArgsConstructor注解,配合原有的@Data、@Builder即可解决问题:
修改后的代码:
@Entity @Table(name = "student_details") @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Student { @Id private int studentId; private String studentName; private String courseEnrolled; private String rollNo; }
注解作用说明:
@NoArgsConstructor:显式生成无参构造器,统一Lombok的构造器生成逻辑,避免和@RequiredArgsConstructor的自动生成逻辑冲突。@AllArgsConstructor:生成全参构造器,供@Builder内部使用(建造者模式依赖全参构造器完成对象构建)。@Data:提供getter、setter、toString、equals等基础方法。@Builder:保留链式构建对象的能力。
这个配置既满足JPA对无参构造器的要求,又能正常使用建造者模式,同时解决了注解冲突问题。
内容的提问来源于stack exchange,提问作者CuriousMind
相关产品推荐
相关产品推荐

