Proguard导致Jackson错误。
Proguard导致Jackson错误。
启用proguard规则后,我遇到了以下问题:
在发送任何内容到网络之前就出现了错误。
java.lang.RuntimeException: 无法将FormDocTankPermission转换为RequestBody
造成原因是:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 找不到FormDocTankPermission类的序列化程序,也没有发现任何属性来创建BeanSerializer(为了避免异常,请禁用SerializationFeature.FAIL_ON_EMPTY_BEANS)
我发送的类,作为@Retrofit.Body
,如下所示:
class FormDocTankPermission (
@get:JsonProperty("fuelCardId")
val fuelCardId: Long,
@get:JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
@get:JsonProperty("validityDate")
val validityDate: Date
)
我猜想某种方式@get:JsonProperty
导致了问题
我创建Retrofit的方式如下:
Builder()
.[...]
.addConverterFactory(JacksonConverterFactory.create())
Jackson的proguard规则:
# Jackson
-keep class com.fasterxml.jackson.databind.ObjectMapper {
public
protected
}
-keep class com.fasterxml.jackson.databind.ObjectWriter {
public ** writeValueAsString(**);
}
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
Proguard导致Jackson错误的原因及解决方法
当使用Proguard混淆工具时,可能会导致Jackson库出现错误。下面是解决这个问题的原因和方法:
原因:
Proguard会移除一些类和方法,这可能导致Jackson无法正常工作。特别是Jackson使用了注解,而Proguard默认会移除未使用的注解。此外,Proguard还可能移除与Jackson相关的一些警告信息。
解决方法:
如果在没有使用Proguard的情况下正常工作,可以尝试以下Proguard规则:
-keepattributes Signature,*Annotation*,EnclosingMethod (保留Signature、注解和EnclosingMethod属性,因为Jackson使用了注解) -keep class com.fasterxml.jackson.** { *; } (保留com.fasterxml.jackson包下的所有类和方法) -dontwarn com.fasterxml.jackson.databind.** (不抛出来自com.fasterxml.jackson.databind包的警告) -dontwarn com.fasterxml.jackson.** (不抛出任何来自com.fasterxml.jackson包的警告) -keep class org.json.JSONObject.** { put(java.lang.String,java.util.Map); } (保留org.json.JSONObject类中的put方法)
如果有自定义的Jsonserializer类,也需要保留它。
希望这些方法能够帮助你解决问题。