我目前正在使用Jackson 1.4.2并尝试反序列化从我们的UI传递回Java控制器(Servlet)的code
值(类型信息的唯一标识符)。
有多种类型(例如ABCType
,XYZType
等)都来自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
扩展的具体类型之间挣扎?)?
答案 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中添加工厂方法并从那里调度方法。