【问题标题】:How can I get FasterXMLJackson to use @JsonCreator mixin?如何让 FasterXMLJackson 使用 @JsonCreator mixin?
【发布时间】:2016-10-19 11:46:46
【问题描述】:

全部,

任何人都可以看到我的方式的错误吗?

我需要从 JSON 进行自定义反序列化,才能在 Drop Wizard 中工作。我遵循了一些方法,但它不起作用。结果是我没有可用的、默认的、无参数的构造函数。相反,我有一个工厂方法。我无法修改我试图反序列化的类。我可以序列化为 JSON 序列化和反序列化到 XML 和从 XML 反序列化。但是从 JSON 反序列化是个障碍。

我已经阅读了我在 SO 和其他地方可以找到的所有内容,但没有任何规定的工作。

我创建了一个 mixin:

public class PatientMixin {

    @JsonCreator
    public static ForecastPatient createForecastForecastPatient() {
        return ForecastFactory.eINSTANCE.createForecastPatient();
    }
}

在我的 DW Application.run(...) 中,我这样做了:

<code before>        
environment.getObjectMapper().addMixIn(ForecastPatient.class, PatientMixin.class);
<code after>

以上内容应该足以让 Jackson 找到我的 Mixin 并致电工厂。相反,我收到了一个错误:

Can not construct instance of forecast.ForecastPatient, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information

我原以为我已经正确映射了东西,但显然没有。此外,我正在阅读的许多示例似乎已经过时了。

提前致谢

【问题讨论】:

  • forecast.ForecastPatient 是抽象类吗?
  • 不,它不是抽象的,它是一个接口,工厂方法返回一个实现。预测患者等。由eclipse建模框架生成。
  • Jackson 不能实例化一个接口你应该告诉 jackson 你想实例化哪个实现

标签: java serialization jackson deserialization


【解决方案1】:

默认情况下,Jackson 尝试使用“默认”构造函数(一个 不带参数),创建值实例时。但你也可以 选择使用另一个构造函数或静态工厂方法 创建实例。为此,您需要使用注释 @JsonCreator,以及可能的 @JsonProperty 注释以将名称绑定到 论据

https://github.com/FasterXML/jackson-annotations#using-constructors-or-factory-methods

表示ForecastFactory.createForecastPatient() 应该用@JsonCreator 注释

【讨论】:

  • 如果你的意思是把 ForecastFactory 改成这样:
  • 如果您的意思是将 ForecastFactory 修改为:@JsonCreator public ForecastPatient createForecastPatient()。不能做,因为 ForecastFactory 是生成的代码。这就是问题所在。
  • 我认为我的 Mixin 是正确的,问题在于 Jackson 找到了它。有趣的是,它记得我曾经做过这项工作。
  • 你有 ForecastPatient 接口的实现吗?
  • 哦,是的,这就是 EMF 的工作方式,使用工厂而不是构造函数。除了这种情况之外,所有的 EMF 代码都会生成并正常工作。
猜你喜欢
  • 1970-01-01
  • 2014-10-28
  • 2014-06-10
  • 1970-01-01
  • 2020-04-06
  • 2012-06-11
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多