Proguard导致Jackson错误。

6 浏览
0 Comments

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.**

0
0 Comments

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类,也需要保留它。

希望这些方法能够帮助你解决问题。

0
0 Comments

Proguard 导致 Jackson 错误的问题出现的原因是,Proguard 可能会移除自定义序列化程序/反序列化程序的默认构造函数。为了解决这个问题,可以使用以下规则:

-keepclassmembers class ** extends com.fasterxml.jackson.databind.ser.std.** {

public (...);

}

-keepclassmembers class ** extends com.fasterxml.jackson.databind.deser.std.** {

public (...);

}

这也是我遇到的问题。

0