如何成功重构 JsonTypeInfo 属性并保持向后兼容性

问题描述

我正在努力解决 Java 和 Jackson 中的一些向后兼容性问题。

假设我们有以下界面:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.EXISTING_PROPERTY,property = "oldName")
@JsonSubTypes({
  @JsonSubTypes.Type(value = Bar.class,name = Bar.TYPE_NAME),...
})
public interface FooType {}

一切正常,我可以反序列化和序列化 Bar。用于反序列化的 Bar JSON 包括一个类似 "oldName":"BarType" 的条目。然而,现在我们需要 将 "oldName" 重构为 "newName",这显然破坏了现有 JSON 文件的反序列​​化,因为无法再提取 typeInfo 并且我们得到预期的错误消息:missing type id property 'newName'

我们尝试了什么:

  1. 为财产寻找任何别名形式=> 没有成功:-(
  2. 使用 DeserializationProblemHandler 和覆盖:
  @Override
  public JavaType handleMissingTypeId(
      DeserializationContext ctxt,JavaType baseType,TypeIdResolver idResolver,String failureMsg)
      throws IOException

重构后,确实,在加载带有“oldName”的 JSON 时会调用方法,并且我看到 baseType 是 FooType。但是,我们无法提取“oldName”属性并将其映射到“newName”。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...