【问题标题】:Jackson not recognizing @JsonCreator annotation杰克逊不承认@JsonCreator 注释
【发布时间】:2011-03-08 08:00:16
【问题描述】:

我目前正在使用 Jackson 1.4.2 并尝试反序列化从我们的 UI 传递回 Java 控制器 (Servlet) 的 code 值(类型信息的唯一标识符)。

有多种类型(例如ABCTypeXYZType 等)都从AbstractType 扩展而来,但每个具体类型都有一个静态工厂方法,该方法接受单个参数、唯一标识符和返回由该标识符表示的类型对象(名称、关联类型、描述、有效首字母缩写词等)。每个具体类型(例如XYZType)中的静态方法都用@JsonCreator注解:

@JsonCreator
public static XYZType getInstance(String code) {
    .....
}

我看到的问题是杰克逊的映射器试图将 json 反序列化为这些类型时抛出的异常:

原因:org.codehaus.jackson.map.JsonMappingException:找不到类型[简单类型,类com.company.type.XYZtype]的默认构造函数:无法从Json对象实例化。

我在这里缺少对静态工厂方法的 @JsonCreator 注释(还是与 Jackson 1.4.2 与从 AbstractType 扩展的具体类型苦苦挣扎的问题有关?)?

【问题讨论】:

    标签: java ajax json annotations jackson


    【解决方案1】:

    注解@JsonCreator 需要注解@JsonProperty。这个Jackson wiki page 提供的信息很少,但确实提供了示例代码:

    @JsonCreator
    public Name(@JsonProperty("givenName") String g, @JsonProperty("familyName") String f)
    {
      givenName = g;
      familyName = f;
    }
    

    你可以在this blog post找到更详细的解释。

    因此,您的示例代码应如下所示:

    @JsonCreator
    public static XYZType getInstance(@JsonProperty("someCode") String code)
    {
     ...
    }
    

    【讨论】:

      【解决方案2】:

      问题是 Jackson 只看到声明的基类型,不知道去哪里寻找子类型。 由于在 1.5 中添加了完整的多态类型处理,因此您需要对 1.4 做的是在基类中添加工厂方法并从那里分派方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 2015-05-18
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 2015-09-28
        相关资源
        最近更新 更多