当前位置: 首页 > 知识库问答 >
问题:

Proguard导致jackson错误

朱乐逸
2023-03-14

启用proguard规则后,我在向网络发送任何内容之前遇到以下错误。

java.lang.RuntimeException:无法将FormDocTankPermission转换为RequestBody

引起的

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:找不到类FormDocTankPermission的序列化程序,也找不到创建BeanSerializer的属性(若要避免异常,请禁用SerializationFeature.fail_on_empty_beans)

我作为@reverfit.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会导致问题

我喜欢这样改装

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

共有1个答案

冯宏恺
2023-03-14

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

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

-keepclassmembers class ** extends com.fasterxml.jackson.databind.deser.std.** {
   public <init>(...);
}
 类似资料:
  • 问题内容: 使用Jackson将hibernate对象转换为JSON时,我遇到问题,因为某些对象在其定义中具有自引用。问题是我无法控制这些实体的代码,因此无法在其中放置注释。 实际上,我只想将递归的深度限制为例如5个级别。我需要与包含自我引用的任何实体对象一起使用的通用代码。可能吗?我不介意使用另一个JSON库。 下面的简单代码 给我例外: 在此先感谢您的任何建议! 问题答案: 使用Jackson

  • 当我尝试使用RESTEasy检索数据时,会出现以下异常: 原因:org。科德豪斯。杰克逊。地图JsonMappingException:找不到类org的序列化程序。冬眠代理波乔。javassist。JavassistLazInitializer,未发现创建BeanSerializer的属性(为了避免异常,请禁用SerializationConfig.Feature.FAIL_ON_EMPTY_be

  • 问题内容: 由于某些原因,我的fx:id无法正确绑定到我的类,因此始终会导致错误。 控制者 XML文件 我认为我了解问题的根源,但不了解如何正确解决。根据这个问题的答案,我认为我正在尝试在调用构造函数之前分配FXML元素(并且这些元素只能在初始化期间/之后分配)。 有没有办法 不 执行此操作?还是我犯了一个完全不同的错误? 问题答案: 您使用进口 在您的fxml文件中。 因此,在加载fxml文件时

  • 我想我明白我的问题的根源,但我不明白如何正确地解决它。根据这个问题的答案,我认为我试图在调用构造函数之前分配FXML元素(这些元素只能在初始化期间/之后分配)。 有没有一种方法可以在不实现的情况下做到这一点?还是我犯了一个完全不同的错误?

  • 我已经在我的gradle文件中启用了来使用ProGuard的特性来混淆代码,结果导致一些错误。 注意:动态创建的类实例有1个类强制转换。您可能会考虑显式保留提到的类和/或它们的实现(使用'-keep')。 警告:有309个未解析的类或接口引用。您可能需要添加丢失的库JAR或更新它们的版本。如果您的代码在没有丢失类的情况下运行良好,则可以使用'-dontwarn'选项抑制警告。(http://pro

  • 在kotlin引用的属性和字段一节中,写了以下示例: var AllByDefault:int?//错误:需要显式初始化器,隐含默认getter和setter @toniedzwiedz的回答解决了这个问题。这是我的错.我把属性和变量搞错了。