Proguard导致Jackson错误。

4

启用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 <methods>;
    protected <methods>;
}
-keep class com.fasterxml.jackson.databind.ObjectWriter {
    public ** writeValueAsString(**);
}
-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**

请查看此链接 https://dev59.com/2Wsy5IYBdhLWcg3wtwQd#8395924 - EL TEGANI MOHAMED HAMAD GABIR
2个回答

2

Proguard可能会删除自定义序列化程序/反序列化程序的默认构造函数。 在这种情况下,以下规则可以帮助我:

-keepclassmembers class ** extends com.fasterxml.jackson.databind.ser.std.** {
   public <init>(...);
}

-keepclassmembers class ** extends com.fasterxml.jackson.databind.deser.std.** {
   public <init>(...);
}

这也是我的问题。 - Ty Kroll

0

如果没有使用 proguard 正常运行,那么您应该尝试以下的 proguard 规则:

**-keepattributes** Signature,\*Annotation\*,EnclosingMethod
(Because jackson uses annotation)

**-keep** class com.fasterxml.jackson.** { *; } (Keep everything under the jackson package)

**-dontwarn** com.fasterxml.jackson.databind.** (Do not throw warning from here)

**-dontwarn** com.fasterxml.jackson.** (Do not throw any kind of warning from here)

**-keep** class org.json.JSONObject.** {** put(java.lang.String,java.util.Map);}

如果您有自定义的 Jsonserializer<>,您需要保留它。

希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接