gRPC调用时出现Protobuf NoSuchMethodError问题求助
解决gRPC调用中Protobuf序列化的NoSuchMethodError问题
这个错误的核心原因是Protobuf版本不兼容:生成Java代码时使用的Protobuf版本,和项目运行时依赖的Protobuf版本不一致,导致运行时找不到GeneratedMessageV3$Builder.parseUnknownField方法。
下面是具体的解决步骤:
统一所有Protobuf相关依赖的版本
检查项目里的protobuf-java、grpc-protobuf、grpc-protobuf-lite等依赖,确保它们的版本完全匹配。比如用Maven的话,在dependencyManagement里锁定版本,避免不同依赖引入不同版本的Protobuf:<dependencyManagement> <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.21.12</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.56.1</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf-lite</artifactId> <version>1.56.1</version> </dependency> </dependencies> </dependencyManagement>Gradle可以用bom来统一管理:
implementation platform('io.grpc:grpc-bom:1.56.1') implementation 'io.grpc:grpc-protobuf' implementation 'com.google.protobuf:protobuf-java:3.21.12'重新生成Protobuf Java代码
确保编译.proto文件的protoc版本和依赖版本一致,比如依赖用3.21.12,protoc也要用同版本。然后删除旧的生成代码,重新生成,避免残留旧版本的代码文件。排查并排除依赖冲突
用Maven的mvn dependency:tree或者Gradle的./gradlew dependencies命令查看依赖树,找有没有第三方库偷偷引入了不同版本的Protobuf。如果有,直接排除掉:<dependency> <groupId>第三方库groupId</groupId> <artifactId>第三方库artifactId</artifactId> <exclusions> <exclusion> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> </exclusion> </exclusions> </dependency>避免Lite版和标准版混用
错误日志里出现了ProtoLiteUtils,说明用到了Lite版Protobuf。要确保:- 如果用
grpc-protobuf-lite,生成代码时要加--java_out=lite:输出目录参数启用Lite模式。 - 不要同时引入
grpc-protobuf和grpc-protobuf-lite,二选一即可。
- 如果用
内容的提问来源于stack exchange,提问作者NeverSleeps
相关产品推荐
相关产品推荐

