前卫导致杰克逊错误



在启用proguard规则后,我面对以下因此,错误在将任何内容发送到网络之前出现。

java.lang.runtimeException:无法转换 formdoctankpermission请求

引起

com.fasterxml.jackson.databind.exc.invaliddefinitionException:否 为class formdoctankpersmission找到的序列化器,没有属性 发现创建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会导致问题

i Cretea Raturofit像这样

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

杰克逊的前卫规则

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

proguard可能会删除自定义序列化器/deserializers的默认构造函数。在这种情况下,该规则对我有所帮助:

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

如果它在没有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&lt;> ,则必须保留它。

我希望,对您有帮助。