Приоритет десериализатора Джексона? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть приложение 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 голосов
/ 29 декабря 2018

Оказывается, есть довольно простое решение этой проблемы с использованием DeserializationProblemHandler.

. Я реализовал то, что до сих пор работает для всех тестовых случаев:

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());
   }
}
Добавить конструктор для каждого из полиморфных классов, который принимает строковый аргумент, который является href.
...