升级Square Wire库至3.4+后遇ProtoEnum类找不到错误求助
Wire升级后ProtoEnum找不到问题的解决办法
问题原因
com.squareup.wire.ProtoEnum是Wire 1.x版本专属类,在2.x及后续版本中已被彻底移除并重构了枚举相关实现逻辑。你的Order类基于Wire 1.x的API编写(继承旧版com.squareup.wire.Message),升级到3.4+版本后,旧版类依赖的ProtoEnum不存在,因此触发NoClassDefFoundError。
可行解决方案
方案1:引入兼容模块(仅Wire 3.x支持)
Wire 3.x系列提供了兼容旧版代码的模块,引入后可恢复ProtoEnum类,让旧版Message子类正常运行:
// 版本号需与你使用的wire-runtime主版本保持一致 implementation 'com.squareup.wire:wire-compatibility:3.4.0'
注:Wire 4.x已移除该兼容模块,此方案仅适用于3.x版本
方案2:改用Wire原生JSON反序列化(无需Gson)
如果使用Wire 4.x或兼容模块无效,可切换到新版Wire自带的JSON处理工具,避免依赖Gson的WireTypeAdapterFactory:
- 先添加
wire-json依赖:
implementation 'com.squareup.wire:wire-json:4.9.1'
- 修改反序列化代码:
import com.squareup.wire.ProtoAdapter; import java.io.IOException; // ... protected Order deserializeOrder(com.amazonaws.services.sqs.model.Message message) throws IOException { ProtoAdapter<Order> orderAdapter = ProtoAdapter.get(Order.class); return orderAdapter.fromJson(message.getBody()); }
新版Wire的ProtoAdapter对旧版Message类做了反射兼容处理,不会再寻找已移除的ProtoEnum。
方案3:重新生成Order类(若允许修改)
如果可以重新生成Order类,使用对应版本的Wire代码生成器重新生成实体类,新版生成的类会适配新版Wire API,彻底消除旧版依赖。但你提到无法修改Order类,此方案仅作备选。
注意事项
- 禁止同时引入多版本Wire依赖,会引发类加载冲突。
- Wire 4.x完全放弃了旧版API兼容,使用4.x时只能选择方案2或方案3。
内容的提问来源于stack exchange,提问作者Chris B
相关产品推荐
相关产品推荐

