R2dbc集成测试中已定义无参构造仍无法实例化User实体报错问题
问题原因分析
- 核心原因是
User类的无参构造函数为包私有访问权限:你代码中定义的User() {}没有添加public修饰符,测试准备数据阶段代码和User类处于同一个包下,可正常访问该构造函数完成实例化;而接口调用逻辑运行在独立的reactor调度线程上下文,Spring Data R2dbc的字节码生成实例化器没有权限访问包私有构造函数,导致实例化失败。 - 次要排查点:父类
AbstractAuditingEntity没有可访问的无参构造函数,或父类存在初始化异常逻辑。 - 其他可能:你未提供
User字段的public setter方法,同时未指定持久化构造函数,Spring Data R2dbc实例化后无法完成字段赋值触发异常。
解决方案
- 优先修改
User类无参构造的访问权限为public,同时确认父类AbstractAuditingEntity也存在public无参构造:
@Table("user") public class User extends AbstractAuditingEntity implements Serializable { // 新增public修饰符 public User() { } // 其余原有代码保持不变 }
- 若不希望暴露public无参构造,可添加注解强制使用字段访问模式,并指定持久化带参构造:
@Table("user") // 强制Spring Data R2dbc使用字段反射赋值,无需setter方法 @org.springframework.data.annotation.AccessType(org.springframework.data.annotation.AccessType.Type.FIELD) public class User extends AbstractAuditingEntity implements Serializable { User() { } // 新增全参数持久化构造函数 @org.springframework.data.annotation.PersistenceConstructor public User(String id, String login, String firstName, String lastName) { this.id = id; this.login = login; this.firstName = firstName; this.lastName = lastName; } // 其余原有代码保持不变 }
- 如果你使用Lombok生成构造方法,补充以下注解即可:
@Table("user") @Data @Builder @NoArgsConstructor(access = AccessLevel.PUBLIC) @AllArgsConstructor public class User extends AbstractAuditingEntity implements Serializable { // 字段定义保持不变 }
内容的提问来源于stack exchange,提问作者DarkFeud
相关产品推荐
相关产品推荐

