You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R2dbc集成测试中已定义无参构造仍无法实例化User实体报错问题

问题原因分析
  • 核心原因是User类的无参构造函数为包私有访问权限:你代码中定义的User() {}没有添加public修饰符,测试准备数据阶段代码和User类处于同一个包下,可正常访问该构造函数完成实例化;而接口调用逻辑运行在独立的reactor调度线程上下文,Spring Data R2dbc的字节码生成实例化器没有权限访问包私有构造函数,导致实例化失败。
  • 次要排查点:父类AbstractAuditingEntity没有可访问的无参构造函数,或父类存在初始化异常逻辑。
  • 其他可能:你未提供User字段的public setter方法,同时未指定持久化构造函数,Spring Data R2dbc实例化后无法完成字段赋值触发异常。
解决方案
  1. 优先修改User类无参构造的访问权限为public,同时确认父类AbstractAuditingEntity也存在public无参构造:
@Table("user")
public class User extends AbstractAuditingEntity implements Serializable {
    // 新增public修饰符
    public User() {
    }
    // 其余原有代码保持不变
}
  1. 若不希望暴露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;
    }
    // 其余原有代码保持不变
}
  1. 如果你使用Lombok生成构造方法,补充以下注解即可:
@Table("user")
@Data
@Builder
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor
public class User extends AbstractAuditingEntity implements Serializable {
    // 字段定义保持不变
}

内容的提问来源于stack exchange,提问作者DarkFeud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:24:09