【问题标题】:Proguard causes Jackson errorProguard导致杰克逊错误
【发布时间】:2018-07-29 21:27:49
【问题描述】:

启用 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 会导致 ISSUE

我喜欢这样改造

Builder()
.[...]
.addConverterFactory(JacksonConverterFactory.create())

杰克逊的 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.**

【问题讨论】:

标签: android jackson android-proguard fasterxml


【解决方案1】:

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

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

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

【讨论】:

  • 这也是我的问题。
【解决方案2】:

如果没有proguard也能正常工作,你应该试试下面的pro-guard规则:

**-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 ,则必须保留它。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-09
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2020-06-30
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多