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

如何在Quarkus Mutiny WebClient中添加自定义拦截器注入关联ID

为Vert.x Mutiny WebClient添加请求头拦截器(日志关联ID)

你可以通过为WebClient添加全局请求拦截器的方式,自动给所有出站REST请求注入日志关联ID,具体实现步骤如下:

1. 实现请求拦截器

创建一个HttpRequestInterceptor的实现类,在请求发送前注入关联ID头:

import io.vertx.ext.web.client.HttpRequestInterceptor;
import io.vertx.ext.web.client.HttpRequest;
import io.quarkus.vertx.http.runtime.CurrentVertxRequest;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

@ApplicationScoped
public class CorrelationIdInterceptor implements HttpRequestInterceptor {

    // 注入Quarkus的当前请求上下文,用于获取关联ID
    @Inject
    CurrentVertxRequest currentVertxRequest;

    @Override
    public void beforeRequest(HttpRequest<?> request) {
        // 从当前请求上下文获取关联ID(假设你已在入站请求中设置该ID)
        String correlationId = currentVertxRequest.current().get("correlation-id");
        // 若无需从入站请求获取,也可在此直接生成ID
        // String correlationId = UUID.randomUUID().toString();
        
        // 为出站请求添加标准关联ID头
        if (correlationId != null) {
            request.putHeader("X-Correlation-ID", correlationId);
        }
    }
}

2. 给WebClient注册拦截器

在创建WebClient实例时,将拦截器绑定到客户端:

import io.vertx.mutiny.core.Vertx;
import io.vertx.mutiny.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

@ApplicationScoped
public class WebClientProducer {

    @Inject
    Vertx vertx;

    @Inject
    CorrelationIdInterceptor correlationIdInterceptor;

    public WebClient createWebClient() {
        WebClientOptions options = new WebClientOptions()
                // 添加客户端基础配置,如超时、连接池参数等
                .setConnectTimeout(5000);
        
        return WebClient.create(vertx, options)
                // 注册全局拦截器,所有出站请求都会被处理
                .addInterceptor(correlationIdInterceptor);
    }
}

3. 验证效果

之后所有通过该WebClient发送的请求(比如你示例中的retrieveDataFromWikipedia方法),都会自动带上X-Correlation-ID请求头,无需在每个请求方法中手动编写头部添加逻辑。

注意事项

  • 修正你原代码中的拼写错误:Webclient需改为WebClient,vertex需改为vertx,避免编译错误。
  • 拦截器是全局生效的,只要复用同一个WebClient实例,所有出站请求都会被拦截处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:46:29