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

启用ProGuard后Jackson序列化报错:无法转换FormDocTankPermission为RequestBody

解决ProGuard启用后Jackson序列化FormDocTankPermission的错误

这个问题我太熟了,本质就是ProGuard混淆的时候把你的FormDocTankPermission实体类给“误伤”了——因为Jackson是通过反射来序列化类的,ProGuard不知道这个类被反射调用了,就把它的属性、getter/setter甚至类结构给改了,导致Jackson找不到可序列化的属性,才抛出那个InvalidDefinitionException。

给你几个靠谱的解决办法,按优先级来:

1. 给实体类加@Keep注解(最省心)

直接在你的FormDocTankPermission类上加上AndroidX的@Keep注解,告诉ProGuard别动这个类:

import androidx.annotation.Keep;

@Keep
public class FormDocTankPermission {
    // 你的类属性、构造方法、getter/setter都保留原样就行
}

这个注解会让ProGuard完整保留这个类的所有成员,不会混淆也不会移除。

2. 在ProGuard规则里手动保留类

如果不想用注解,就直接在你的ProGuard配置文件(一般是proguard-rules.pro)里加这条规则,替换成你实际的包名:

# 保留FormDocTankPermission类及其所有成员
-keep class com.your.package.name.FormDocTankPermission { *; }

这条规则和@Keep的效果一样,强制ProGuard不处理这个类。

3. 临时关闭Jackson的FAIL_ON_EMPTY_BEANS特性(不推荐长期用)

如果只是想临时规避错误,可以在配置Jackson的ObjectMapper时关闭这个特性,但这只是治标不治本——如果你的类本来有属性,混淆后Jackson还是没法正确序列化它们:

ObjectMapper objectMapper = new ObjectMapper();
// 关闭空bean序列化失败的特性
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

// 把这个配置好的objectMapper传给Retrofit的ConverterFactory
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("your_base_url")
    .addConverterFactory(JacksonConverterFactory.create(objectMapper))
    .build();

总结一下,优先用前两种方法,确保实体类不被ProGuard混淆,这才是解决问题的根本。

内容的提问来源于stack exchange,提问作者Piotr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:12:57