我有一个Spring Boot的应用程序,它正在对ActityStreams对象进行建模,在很大程度上,Jackson的多态反序列化工作得很好。
JSON中的“对象”是引用(链接),而不是包含类型信息的JSON对象。例如“actor”:“https://some.actors.href/
而不是
"actor":{
"type":"Actor",
"name":"SomeActor"
}
我已经编写了自定义反序列化程序,并将它们放在字段中以解决此问题
@JsonDeserialize (using = ActorOrLinkDeserializer.class)
private Actor actor;
然而,我的< code > actor orlinkdeserializer 已实例化,但从未被调用,并且Jackson在尝试解析[simple type,class org . w3 . activity . streams . actor]的子类型时抱怨< code >缺少类型id:缺少来自多态反序列化程序的类型id属性“type”(对于POJO属性“actor”)。
多态反序列化代码似乎优先于我的本地@JsonDeserialize
注释,我需要一种方法来强制我的代码首先运行。
我已经尝试使用我自己的< code>ObjectMapper而不是Boot的,没有区别。
我很感激你的指点和建议。
事实证明,使用反序列化问题处理程序
有一个相当简单的解决方案。
到目前为止,我实现的适用于所有测试用例的是
1.
objectMapper.addHandler(new DeserProblemHandler());
或注册 Spring Boot。
2.
public class DeserProblemHandler extends DeserializationProblemHandler {
public JavaType handleMissingTypeId(DeserializationContext ctxt, JavaType baseType, TypeIdResolver idResolver, String failureMsg) {
return TypeFactory.defaultInstance().constructType(baseType.getRawClass());
}
}