JDBI Kotlin SqlObject插件Kotlin接口DAO返回类型异常求助
JDBI Kotlin SqlObject插件@SqlUpdate返回类型问题解决
问题重现
DAO接口代码:
interface DTaskStatusDao { @Timestamped @SqlUpdate(ADD_TASK_STATUS_ENTRY) suspend fun insertTask(@BindKotlin @BindMethods taskStatus: TaskStatus<*>) }
使用代码:
val dao = jdbi.onDemand(DTaskStatusDao::class) dao.insertTask(it)
触发异常:DTaskStatusDao.insertTask method is annotated with @SqlUpdate so should return void, boolean, or Number but is returning
核心原因
Kotlin的无返回值suspend函数默认返回Unit,旧版本JDBI Kotlin插件未正确将Kotlin的Unit映射为Java的void,导致类型校验失败;同时未显式声明返回类型时,JDBI的类型解析逻辑无法识别正确的返回类型。
解决方案
显式声明返回类型为
Unit
明确指定函数返回Unit,配合新版JDBI Kotlin插件可让框架正确识别为Java的void:interface DTaskStatusDao { @Timestamped @SqlUpdate(ADD_TASK_STATUS_ENTRY) suspend fun insertTask(@BindKotlin @BindMethods taskStatus: TaskStatus<*>): Unit }确保正确注册Kotlin插件
初始化Jdbi时必须安装Kotlin插件,否则无法处理Kotlin特有的类型和suspend函数:val jdbi = Jdbi.create(dataSource) jdbi.installPlugin(KotlinPlugin())返回受影响行数(可选)
若需要获取SQL执行后受影响的行数,可直接声明返回类型为Int(Kotlin的Int会被JDBI正确映射为Java的int):interface DTaskStatusDao { @Timestamped @SqlUpdate(ADD_TASK_STATUS_ENTRY) suspend fun insertTask(@BindKotlin @BindMethods taskStatus: TaskStatus<*>): Int }
版本要求
确保使用JDBI 3.20.0及以上版本,该版本对Kotlin的Unit类型和suspend函数支持更为完善,完全无需在Java文件中编写DAO接口。
内容的提问来源于stack exchange,提问作者J. Lockhart
相关产品推荐
相关产品推荐

