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

Spring Boot Reactive整合Oracle保存User时遇ClassCastException求助

问题排查与解决

问题原因

这个ClassCastException(Long转Integer)是Spring Data R2DBC处理Oracle数据库返回的受影响行数时的类型不匹配问题。Oracle的R2DBC驱动返回的受影响行数为Long类型,但Spring Data R2DBC内部部分逻辑使用Integer类型接收,导致强制转换失败。

解决方案

1. 升级适配依赖版本

确保Spring Data R2DBC与Oracle R2DBC驱动版本匹配,优先使用较新版本修复类型兼容问题:

  • Spring Data R2DBC:至少1.5.0及以上(对应Spring Boot 2.7.x+)
  • Oracle R2DBC驱动:com.oracle.database.r2dbc:oracle-r2dbc:1.0.0及以上

修改项目依赖配置(以Gradle Kotlin为例):

implementation("org.springframework.data:spring-data-r2dbc:1.5.10")
implementation("com.oracle.database.r2dbc:oracle-r2dbc:1.0.2")

2. 自定义保存逻辑(临时兼容方案)

如果暂时无法升级依赖,可通过DatabaseClient手动实现保存逻辑,绕过Spring Data内部的行数统计逻辑:

@Service
class UserService(
    private val databaseClient: DatabaseClient
) {
    fun saveUser(user: Users): Mono<Users> {
        return databaseClient.insert()
            .into(Users::class.java)
            .using(user)
            .fetch()
            .one()
            .map { user }
    }
}

调用时替换为自定义Service的方法:

val u = Users("123", "123", "123")
userService.saveUser(u).subscribe { println(it.email) }

3. 确认实体映射正确性

当前实体类与数据库表的字段映射匹配度没问题:LocalDateTime对应Oracle的TIMESTAMP(6),字符串类型字段对应VARCHAR2,无需额外调整。

验证步骤

  1. 清理项目依赖缓存,重新构建项目
  2. 执行保存代码,确认异常是否消除

内容的提问来源于stack exchange,提问作者KS Kian Seng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:35:18