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

Quarkus中获取托管Router实例失败,求解决方法

无法在Quarkus中获取托管的Vert.x Router实例

问题描述

尝试直接使用Vertx和Router时,执行代码无法获取托管的Router实例。代码如下:

@QuarkusMain
public class Main {

  public static void main(String... args) {
    Quarkus.run(MyApp.class, args);
  }

  static class MyApp implements QuarkusApplication {

    @Override    
    public int run(String... args) {
      Router router = CDI.current().select(Router.class).get();
      Quarkus.waitForExit();
      return 0;
    }
  }
}

执行到CDI.current().select(Router.class).get();时抛出异常:

jakarta.enterprise.inject.UnsatisfiedResolutionException: No bean found for required type [interface io.vertx.ext.web.Router] and qualifiers [[]]

初始依赖配置:

dependencies {
    implementation(enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
    implementation("io.quarkus:quarkus-resteasy-reactive-jackson")
    implementation("io.quarkus:quarkus-resteasy-reactive")
    implementation("io.quarkus:quarkus-arc")
    testImplementation("io.quarkus:quarkus-junit5")
    testImplementation("io.rest-assured:rest-assured")
}

更新尝试

已添加指南指定的依赖(quarkus-vertx-http原本已是传递依赖,单独声明后问题仍未解决):

dependencies {
  implementation(enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
  implementation("io.quarkus:quarkus-arc")
  implementation("io.vertx:vertx-web")
  implementation("io.quarkus:quarkus-vertx-http")
  testImplementation("io.quarkus:quarkus-junit5")
  testImplementation("io.rest-assured:rest-assured")
}

解决思路

1. 等待HTTP服务器初始化完成

QuarkusApplication.run方法执行时,HTTP服务器(包括Router)可能尚未完成初始化。需通过观察者模式监听HTTP服务器就绪事件,此时Router已完全初始化:

@QuarkusMain
public class Main {

  public static void main(String... args) {
    Quarkus.run(MyApp.class, args);
  }

  static class MyApp implements QuarkusApplication {

    @Override    
    public int run(String... args) {
      Quarkus.waitForExit();
      return 0;
    }

    // 监听HTTP服务器就绪事件
    void onHttpServerReady(@Observes HttpServerReadyEvent event) {
      Router router = CDI.current().select(Router.class).get();
      // 在此处安全使用Router,例如添加自定义路由
      router.route("/custom").handler(ctx -> ctx.response().end("Custom route response"));
    }
  }
}

2. 改用构造注入替代编程式查找

避免使用CDI.current()手动查找,通过构造注入让容器自动注入Router:

@QuarkusMain
public class Main {

  public static void main(String... args) {
    Quarkus.run(MyApp.class, args);
  }

  static class MyApp implements QuarkusApplication {

    private final Router router;

    // 构造注入Router
    public MyApp(Router router) {
      this.router = router;
    }

    @Override    
    public int run(String... args) {
      Quarkus.waitForExit();
      return 0;
    }

    void onHttpServerReady(@Observes HttpServerReadyEvent event) {
      // 在此处使用注入的Router
      router.route("/inject").handler(ctx -> ctx.response().end("Injected Router works"));
    }
  }
}

3. 验证依赖完整性

执行Gradle命令查看依赖树,确认quarkus-vertx-http和vertx-web已正确引入:

./gradlew dependencies --configuration implementation

4. 清理构建缓存

若在开发模式下运行,执行清理命令后重启应用,避免缓存导致的依赖或配置问题:

./gradlew clean build

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:55:07