11

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

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

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

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

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

我在这里对@JsonCreator静态工厂方法的注释缺少什么(或者它与杰克逊 1.4.2 与从一个扩展的具体类型作斗争AbstractType?)?

4

2 回答 2

17

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

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

您将在此博客文章中找到更详细的说明。

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

@JsonCreator
public static XYZType getInstance(@JsonProperty("someCode") String code)
{
 ...
}
于 2013-08-07T23:25:24.150 回答
5

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

于 2010-06-28T22:55:42.600 回答