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

use*_*327 10 java ajax json annotations jackson

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

有多种类型(例如ABCType,XYZType等等)都从a扩展AbstractType,但每种具体类型都有一个静态工厂方法,它作为单个参数,唯一标识符,并返回类型对象(名称,关联类型,描述,由该标识符表示的有效首字母缩写词等.每种具体类型(例如XYZType)中的静态方法都注释为@JsonCreator:

@JsonCreator
public static XYZType getInstance(String code) {
    .....
}
Run Code Online (Sandbox Code Playgroud)

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

引起:org.codehaus.jackson.map.JsonMappingException:找不到类型[simple type,class com.company.type.XYZtype]的默认构造函数:无法从Json对象实例化.

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

Pau*_*aul 14

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

@JsonCreator
public Name(@JsonProperty("givenName") String g, @JsonProperty("familyName") String f)
{
  givenName = g;
  familyName = f;
}
Run Code Online (Sandbox Code Playgroud)

你会在这篇博文中找到更详细的解释.

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

@JsonCreator
public static XYZType getInstance(@JsonProperty("someCode") String code)
{
 ...
}
Run Code Online (Sandbox Code Playgroud)


Sta*_*Man 5

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