添加@NoArgsConstructor的Student实体调用双String参数构造报错如何解决?
问题产生原因
- 你的Student类上显式添加了
@NoArgsConstructor注解后,Lombok的@Data注解默认自带的@RequiredArgsConstructor功能会被覆盖失效,此时类中只会生成无参构造方法,没有接收firstName、lastName两个参数的构造方法,因此测试代码调用双参构造时会抛出参数匹配失败的错误。 - JPA规范要求实体类必须提供公共无参构造方法用于反射实例化,所以你删掉
@NoArgsConstructor注解后,JPA操作实体时会抛出异常,也就是你遇到的实体类异常问题。 - 手动编写双参构造后,类中同时存在Lombok生成的无参构造和你手写的双参构造,同时满足了JPA和业务代码的调用需求,因此运行正常。
解决方法
你可以选择以下任意一种方案,同时满足JPA规范和业务构造需求:
- 添加
@RequiredArgsConstructor注解
直接在实体类上额外新增@RequiredArgsConstructor注解,Lombok会自动为所有被@NonNull修饰且没有设置默认值的字段生成对应参数的构造方法。你的firstName和lastName都添加了@NonNull注解,刚好会生成符合需求的双参构造,修改后的注解配置如下:@Entity @Table(name = "student") @Data @NoArgsConstructor @RequiredArgsConstructor public class Student { // 原有字段逻辑无需修改 } - 添加
@AllArgsConstructor注解
如果后续业务有需要传入所有字段(包括主键studentId)构造对象的场景,可以直接添加@AllArgsConstructor注解生成全参构造方法,这种方案灵活性更高,适合字段较多、构造场景复杂的实体类。
内容的提问来源于stack exchange,提问作者user16624394
相关产品推荐
相关产品推荐

