杰克逊没有认识到@JsonCreator注释

时间:2010-06-25 14:53:39

标签: java ajax json annotations jackson

我目前正在使用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:找不到类型[simple type,class com.company.type.XYZtype]的默认构造函数:无法从Json对象实例化。

我在这里忽略了静态工厂方法的@JsonCreator注释(或者它是否与Jackson 1.4.2在AbstractType扩展的具体类型之间挣扎?)?

2 个答案:

答案 0 :(得分:14)

注释@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)
{
 ...
}

答案 1 :(得分:5)

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