我有一个这样的课程:
class MyClass {
CustomList<String> list = ListUtils.createCustomList();
}
interface CustomList implements java.util.List
,因此无法使用构造函数进行反序列化。相反,有一个class ListUtils
创建一个实现实例。接口和实用程序类都在外部库中,因此我无法对它们进行注释。
我怎么能告诉杰克逊遇到CustomList
时应该调用ListUtils.createCustomList()
而不是构造函数?是否有mixin配置,我可以从类型到构造方法指定的映射,或者我需要编写的自定义反序列化器?
答案 0 :(得分:1)
这里有2个问题,第一个问题是如何告诉Jackson使用另一个类ListUtils
的静态方法来创建CustomList
类的实例。您可以@JsonCreator
使用静态方法CustomList
或混合使用ListUtils
。不幸的是,您无法在class ListDeserializer extends JsonDeserializer<CustomList> {
@Override
public CustomList deserialize(JsonParser p, DeserializationContext c) throws IOException {
return ListUtils.createCustomList();
}
}
上使用它。有一个open issue。
在实现/发布上述请求之前,您必须创建自定义反序列化程序。这种反序列化器的骨架实现看起来像这样:
JsonParser
使用其他初始化步骤扩展此方法,例如使用ObjectMapper
解析元素并在返回之前将它们添加到列表中。查看示例here。您可以在ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(CustomList.class, new ListDeserializer());
mapper.registerModule(module);
:
IDistributedCache