提问者:小点点

杰克逊反序列化器优先级?


我有一个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个答案

匿名用户

事实证明,使用反序列化问题处理程序有一个相当简单的解决方案。

到目前为止,我实现的适用于所有测试用例的是

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());
   }
}