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
相关产品推荐
相关产品推荐

