You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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:

  1. 先添加wire-json依赖:
implementation 'com.squareup.wire:wire-json:4.9.1'
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:48:22