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

