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

Quarkus gRPC服务中注入RoutingContext失败问题求助

在Quarkus gRPC服务中获取HTTP上下文的解决方案

你遇到的异常是因为Quarkus gRPC服务的请求上下文和Vert.x Web的RoutingContext不兼容:虽然gRPC基于HTTP/2,但Quarkus的gRPC框架并未将请求绑定到普通的Vert.x HTTP上下文中,导致CurrentVertxRequest.getCurrent()返回null,触发注入异常。

要在Quarkus gRPC服务中获取HTTP相关的请求信息(比如请求头),可以通过gRPC的元数据(Metadata)来实现,具体步骤如下:

正确的实现方式

  1. 注入Quarkus提供的CurrentGrpcRequest,用于获取gRPC请求的上下文
  2. 从gRPC请求的属性中提取元数据(对应HTTP/2的请求头)
  3. 通过元数据Key获取目标请求头

代码示例:

import io.grpc.Metadata;
import io.quarkus.grpc.runtime.context.CurrentGrpcRequest;
import jakarta.inject.Inject;
import io.quarkus.security.Authenticated;
import io.quarkus.grpc.GrpcService;

@Authenticated
@GrpcService
public class IEntitlementsGrpcImpl implements IEntitlementsGrpc {

    private static final String DATA_PARTITION_ID = "Data-Partition-Id";
    // 定义对应请求头的Metadata Key
    private static final Metadata.Key<String> DATA_PARTITION_ID_KEY = 
        Metadata.Key.of(DATA_PARTITION_ID, Metadata.ASCII_STRING_MARSHALLER);

    @Inject
    CurrentGrpcRequest currentGrpcRequest;

    @Override
    public void yourGrpcMethod(YourRequest request, StreamObserver<YourResponse> responseObserver) {
        // 获取gRPC请求的元数据(映射HTTP/2请求头)
        Metadata metadata = currentGrpcRequest.serverCall()
            .getAttributes()
            .get(io.grpc.Grpc.TRANSPORT_ATTR_REQUEST_METADATA);
        
        // 提取目标请求头
        String dataPartitionId = metadata.get(DATA_PARTITION_ID_KEY);
        
        // 执行你的业务逻辑
        // ...

        responseObserver.onNext(YourResponse.getDefaultInstance());
        responseObserver.onCompleted();
    }
}

关键说明

  • gRPC over HTTP/2的请求头会被自动映射到gRPC的Metadata对象中,通过TRANSPORT_ATTR_REQUEST_METADATA属性可以获取
  • 必须使用gRPC的Metadata.Key来匹配请求头,确保Marshaller类型(ASCII/二进制)与头内容一致
  • 不要尝试在gRPC服务中直接注入RoutingContext,二者属于不同的请求上下文体系

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:42:41