Десериализация в опционально взрывается с HttpMessageNotWritableException - PullRequest
3 голосов
/ 05 марта 2020

Я использую библиотеку jackson-datatype-jdk8 для десериализации полей json до Optional в моем POJO, настроенном с помощью:

objectMapper.registerModule(new Jdk8Module());

Я использую Optional, потому что мне нужно различать guish между полем, присутствующим в json, но со значением null, которое десериализуется как Optional.empty(), и вообще не имеет поля, которое десериализуется как null (для реализации PATCH метод rest).

Это прекрасно работает для простых типов, но не для Optional из Lists, например:

class MyPojo {
    String plainString;                     // Works
    Optional<String> optionalString;        // Works
    List<String> plainStrings;              // Works
    Optional<List<String>> optionalStrings; // Explodes if json contains data, eg "optionalStrings" : ["foo"]
}

Точная ошибка:

org.springframework.http.converter.HttpMessageNotWritableException: не удалось записать JSON: класс java .lang.String не является подтипом [тип коллекции; класс java .util.List, содержит [простой тип, класс com.foo.MyPojo]];
вложенным исключением является com.faster xml .jackson.databind.JsonMappingException: Class java .lang.String не подтип [тип коллекции; class java .util.List, содержит [простой тип, класс com.foo.MyPojo]] `

Контекст является подпружиненной загрузкой, которая использует ObjectMapper.
Все библиотеки Джексона не позднее версия, которая в настоящее время 2.10.3.
Образец непримечательный json, который должен работать:

{
  "plainString": "foo",
  "optionalString": "foo",
  "plainStrings": [
    "foo"
  ],
  "optionalStrings": [
    "foo"
  ]
}

Чтобы быть понятным, десериализация до Optional<String> optionalString работает как ожидалось, ie:

  • отсутствует в полезной нагрузке -> null
  • в полезной нагрузке со значением NULL -> Optional.empty()
  • в полезной нагрузке со значением -> Optional.of(value)

Но когда поле имеет тип Optional List, десериализация взрывается.

Есть ли обходной путь? Нужна ли аннотация или конфигурация?

...