杰克逊解串器优先级?
Jackson deserializer priority?
我有一个 Spring 正在建模 ActityStreams 对象的启动应用程序,并且在大多数情况下,Jackson 的多态反序列化效果很好。
JSON 中有 'objects' 是引用(链接)而不是 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 的,没有区别。
非常感谢您的指点和建议。
事实证明,这个问题有一个相当简单的解决方案,使用 DeserializationProblemHandler
。
到目前为止,我实施的适用于所有测试用例的是
1.
objectMapper.addHandler(new DeserProblemHandler());
或
2.
public class DeserProblemHandler extends DeserializationProblemHandler {
public JavaType handleMissingTypeId(DeserializationContext ctxt, JavaType baseType, TypeIdResolver idResolver, String failureMsg) {
return TypeFactory.defaultInstance().constructType(baseType.getRawClass());
}
}
- 为每个接受字符串参数的多态 类 添加构造函数,即 href。
我有一个 Spring 正在建模 ActityStreams 对象的启动应用程序,并且在大多数情况下,Jackson 的多态反序列化效果很好。
JSON 中有 'objects' 是引用(链接)而不是 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 的,没有区别。
非常感谢您的指点和建议。
事实证明,这个问题有一个相当简单的解决方案,使用 DeserializationProblemHandler
。
到目前为止,我实施的适用于所有测试用例的是
1.
objectMapper.addHandler(new DeserProblemHandler());
或
2.
public class DeserProblemHandler extends DeserializationProblemHandler {
public JavaType handleMissingTypeId(DeserializationContext ctxt, JavaType baseType, TypeIdResolver idResolver, String failureMsg) {
return TypeFactory.defaultInstance().constructType(baseType.getRawClass());
}
}
- 为每个接受字符串参数的多态 类 添加构造函数,即 href。