启用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
相关产品推荐
相关产品推荐

