杰克逊解串器优先?

时间:2018-12-27 22:18:58

标签: spring-boot jackson jackson2 jackson-databind

我有一个Spring Boot应用程序,它在对ActityStreams对象进行建模,并且在大多数情况下,杰克逊的多态反序列化效果很好。

JSON中有“对象”,它们是引用(链接),而不是具有类型信息的JSON对象。例如 "actor":"https://some.actors.href/而非

"actor":{
   "type":"Actor",
   "name":"SomeActor"
 }

我已经编写了自定义反序列化器,并将其放在字段中以解决此问题

@JsonDeserialize (using = ActorOrLinkDeserializer.class)
private Actor actor;

但是我的ActorOrLinkDeserializer被实例化但从未被调用,杰克逊抱怨Missing type id when trying to resolve subtype of [simple type, class org.w3.activity.streams.Actor]: missing type id property 'type' (for POJO property 'actor'),它来自多态解串器。

多态反序列化代码似乎优先于本地@JsonDeserialize注释,并且我需要一种方法来强制我的代码首先运行。

我尝试使用自己的ObjectMapper而不是Boot的,并且没有区别。

我希望您能提出一些建议和建议。

1 个答案:

答案 0 :(得分:0)

事实证明,使用DeserializationProblemHandler可以解决此问题。

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

1。

objectMapper.addHandler(new DeserProblemHandler());

register with 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());
   }
}
  1. 向每个采用字符串参数href的多态类添加一个构造函数。