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

Quarkus升级后@InjectMock对@ApplicationScoped的RestClient失效如何解决

问题原因
  1. Quarkus 2.x 调整了 REST Client 的默认作用域:1.x 版本中 @RegisterRestClient 标注的接口默认作用域是 @ApplicationScoped(标准 CDI 正常作用域),2.x 版本默认改为了 @Singleton(CDI 伪作用域)。而 @InjectMock 默认仅支持注入标准 CDI 正常作用域的 Bean,伪作用域会触发本次报错。
  2. 你在接口上加的 @ApplicationScoped 注解未生效:一方面 @RegisterRestClient 自带的 scope 属性优先级高于接口上直接添加的作用域注解;另一方面你导入的 @ApplicationScoped 是 javax 包下的,但引入的 CDI 依赖是 jakarta 命名空间的,两者不匹配,注解不会被 CDI 容器识别。
解决方案

以下方案按落地成本从低到高排序,任选其一即可:

  • 方案一:开启 @InjectMock 作用域转换能力
    直接修改测试类的 @InjectMock 注解,添加 convertScopes = true 参数,无需修改业务代码:

    @QuarkusTest
    class MyTest {
        @InjectMock(convertScopes = true)
        @RestClient
        CloudEventPublisher cloudEventPublisherMock;
    
        @Test
        void mytest() {
            // 原有测试逻辑不变
        }
    }
    

    该参数会让 @InjectMock 兼容伪作用域的 Bean 注入,最适合测试场景快速修复问题。

  • 方案二:显式指定 REST Client 作用域
    首先删除 pom.xml 中额外引入的 jakarta.enterprise:jakarta.enterprise.cdi-api 依赖(Quarkus 2.x 全栈使用 javax 命名空间,quarkus-arc 依赖已经自带了正确版本的 CDI API,额外引入会导致包冲突),然后修改 CloudEventPublisher 接口的注解:

    import javax.enterprise.context.ApplicationScoped;
    import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
    // 其余导包保持不变
    
    @Path("/")
    @RegisterRestClient(scope = ApplicationScoped.class) // 直接在注解里指定作用域,不需要单独加@ApplicationScoped
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public interface CloudEventPublisher {
        @POST
        void publishOrder(CloudEvent cloudEvent);
    }
    

    该方案从根源调整 REST Client 作用域,适合需要在生产环境也使用 @ApplicationScoped 的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:48:02