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

Quarkus Reactive WebClient依赖注入失败问题求助

解决Quarkus中RequestFilter注入WebClient的依赖不满足问题

问题场景

基于Quarkus 2.16.1.Final、Java 17、Gradle 7.5.1搭建应用,尝试通过RequestFilter.java过滤所有请求并校验请求头中的token,但启动时触发依赖不满足错误,核心异常信息为:

javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type io.vertx.mutiny.ext.web.client.WebClient and qualifiers [@Default]

错误原因

项目中引入的smallrye-mutiny-vertx-web-client仅提供Mutiny与Vertx WebClient的绑定能力,并未在Quarkus的CDI容器中注册可注入的WebClient Bean,导致无法通过@Inject注入实例。同时代码中手动创建WebClient的逻辑,与依赖注入机制冲突,进一步加剧了问题。

解决方案

1. 修正Gradle依赖

替换原有SmallRye Vertx WebClient依赖为Quarkus官方提供的Vertx WebClient扩展,该扩展会自动在CDI容器中注册WebClient实例:

修改build.gradle中的依赖配置,将:

implementation("io.smallrye.reactive:smallrye-mutiny-vertx-web-client")

替换为:

implementation("io.quarkus:quarkus-vertx-web-client")

2. 修正RequestFilter代码

移除手动创建WebClient的逻辑,直接注入Quarkus提供的WebClient实例,同时调整过滤方法的异步处理逻辑:

import io.quarkus.runtime.util.StringUtil;
import io.vertx.mutiny.ext.web.client.WebClient;
import org.jboss.logging.Logger;
import org.jboss.resteasy.reactive.server.ServerRequestFilter;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.Provider;

@Provider
@ApplicationScoped
public class RequestFilters {

    @Inject
    UriInfo uriInfo;
    @Inject
    Logger logger; 
    @Inject
    WebClient client; // 直接注入Quarkus托管的WebClient实例

    private static final String USER_TOKEN_JWT = "usertoken";
    
    @ServerRequestFilter
    public void requestFilter(ContainerRequestContext requestContext) {
        String token = requestContext.getHeaders().getFirst(USER_TOKEN_JWT);
        if (StringUtil.isNullOrEmpty(token)) {
            logger.error("User token is missing.");
            requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
            return;
        }

        String requestUri = uriInfo.getRequestUri().getPath();
        // 异步处理请求,添加结果回调避免阻塞
        client.getAbs(requestUri)
                // .host("your-validation-service-host")
                // .port(8080)
                .send()
                .subscribe().with(
                    response -> logger.info("Token validation request completed, status: " + response.statusCode()),
                    failure -> logger.error("Token validation request failed", failure)
                );
    }
}

关键说明

  • Quarkus官方的quarkus-vertx-web-client扩展会自动配置并管理WebClient的生命周期,无需手动创建实例。
  • 过滤方法中使用subscribe().with()处理异步请求结果,符合Quarkus响应式设计原则,避免阻塞主线程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:55:34