Quarkus扩展中无法注入生成的gRPC客户端的问题
问题分析与解决
你遇到的错误核心是:Quarkus gRPC客户端扩展仅允许注入Mutiny风格的服务接口、阻塞存根、基于Mutiny的响应式存根或io.grpc.Channel,而你直接注入的Authorization是原始gRPC生成的服务类,不在支持范围内。
解决步骤
1. 确保生成Quarkus兼容的gRPC客户端存根
在你的Quarkus扩展中,配置gRPC代码生成器,生成Quarkus支持的存根类型:
- Maven项目需在
quarkus-grpc-codegen插件中指定生成类型:
<plugin> <groupId>io.quarkus</groupId> <artifactId>quarkus-grpc-codegen-maven-plugin</artifactId> <version>${quarkus.version}</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <protoPaths> <path>src/main/proto</path> </protoPaths> <!-- 可选MUTINY生成响应式存根,或BLOCKING生成阻塞存根 --> <type>MUTINY</type> </configuration> </execution> </executions> </plugin>
- Gradle项目则在
build.gradle中配置:
quarkusGrpcCodeGen { protoPaths = ["src/main/proto"] type = "MUTINY" // 或指定"BLOCKING" }
2. 修改AuthService的注入类型
根据生成的存根类型,调整注入代码:
方式一:注入Mutiny风格响应式存根
@ApplicationScoped public class AuthService { @GrpcClient("auth") AuthorizationMutinyStub authorization; }
方式二:注入阻塞式存根
@ApplicationScoped public class AuthService { @GrpcClient("auth") AuthorizationBlockingStub authorization; }
方式三:通过Channel手动初始化存根
如果需要更灵活的控制逻辑,可以注入Channel后自行创建存根:
@ApplicationScoped public class AuthService { @GrpcClient("auth") Channel channel; private AuthorizationBlockingStub authorizationStub; @PostConstruct void initStub() { authorizationStub = AuthorizationGrpc.newBlockingStub(channel); } }
3. 验证扩展配置
确保你的扩展部署Processor中,已将生成的存根类正确纳入反射或额外Bean配置(如果需要),避免运行时出现类加载问题。
内容的提问来源于stack exchange,提问作者hungbk
相关产品推荐
相关产品推荐

