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)来实现,具体步骤如下:
正确的实现方式
- 注入Quarkus提供的
CurrentGrpcRequest,用于获取gRPC请求的上下文 - 从gRPC请求的属性中提取元数据(对应HTTP/2的请求头)
- 通过元数据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
相关产品推荐
相关产品推荐

