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

Quarkus下Kotlin协程调用Hibernate报CDI上下文未激活如何解决?

问题原因

你直接通过Dispatchers.IO切换协程执行线程时,新的IO线程未携带原线程的CDI请求上下文、事务上下文。而Quarkus Hibernate ORM默认将Session绑定在请求/事务作用域,无激活上下文的情况下无法获取Session实例,就会抛出ContextNotActiveException异常。

解决方案

步骤1:添加协程上下文传播依赖

Quarkus官方提供了Kotlin协程的上下文传播扩展,会自动完成CDI、事务、安全等上下文在协程间的传递,在你的项目配置中引入对应依赖即可:
Maven配置:

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-kotlin-coroutines-context-propagation</artifactId>
</dependency>

Gradle配置:

implementation("io.quarkus:quarkus-kotlin-coroutines-context-propagation")

步骤2:修改协程切换代码

你需要在切换协程调度器时,同时传入捕获的当前线程上下文,修改后的代码如下:

import io.smallrye.context.api.CurrentThreadContext

val entityReferences = withContext(Dispatchers.IO + CurrentThreadContext.captureAll()) {
    // 你的Hibernate / Hibernate Search代码在这里
}

额外注意事项

  • 如果协程块内的数据库操作需要独立事务,可以直接给对应的suspend函数添加@Transactional注解,Quarkus 2.8+版本原生支持suspend函数的事务管理
  • 不要在协程块中操作原线程加载的懒加载实体,若有相关需求需要保证懒加载触发时,Session仍处于激活状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 07:54:02