Я использую библиотеку 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, десериализация взрывается.
Есть ли обходной путь? Нужна ли аннотация или конфигурация?