升级protobuf-java-util至4.26.0后JsonFormat.merge编译报错求助
Protobuf 3.x升级到4.x编译错误原因及解决方法
编译错误核心原因
你遇到的编译问题本质是版本不兼容导致的类型匹配失败,具体分为两点:
- 依赖版本不一致:仅升级
protobuf-java-util到4.26.0,但未同步升级protobuf-java依赖,或生成Selection类的protoc编译器仍为3.x版本。4.x对Protobuf核心API做了重构,3.x生成的Selection.Builder与4.xprotobuf-java-util中要求的com.google.protobuf.Message.Builder类型结构不匹配,导致类型转换失败。 - API继承体系变更:Protobuf 4.x调整了生成代码的继承结构,3.x生成的Builder类不再兼容4.x版本中
JsonFormat.Parser.merge方法的参数类型要求。
解决步骤
- 统一所有Protobuf依赖版本:确保
protobuf-java和protobuf-java-util版本完全一致,都升级到4.26.0:
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>4.26.0</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java-util</artifactId> <version>4.26.0</version> </dependency>
重新生成Protobuf Java代码:使用4.26.0版本的protoc编译器重新编译所有
.proto文件,生成与4.x依赖兼容的Java类(包括Selection.Builder)。临时兼容方案(不推荐长期使用):若暂时无法重新生成代码,可尝试显式类型转换规避错误:
Selection.Builder selectionBuilder = Selection.newBuilder(); JsonFormat.parser().ignoringUnknownFields().merge(selectionJson, (com.google.protobuf.Message.Builder) selectionBuilder);
内容的提问来源于stack exchange,提问作者Jochen Hebbrecht
相关产品推荐
相关产品推荐

