SetValuedMap неправильно десериализован Джексоном - PullRequest
1 голос
/ 25 июня 2019

Я использую Map<String, SetValuedMap<String, CustomerDomain>>. Я получаю правильный результат при отладке, но мой контроллер возвращает следующее. Похоже, Джексон не может десериализовать SetValuedMap.

{
   "first": {
      empty:false
   },
   "second": {
      empty:false
   }
}

1 Ответ

1 голос
/ 25 июня 2019

Это связано с тем, что структурам данных, таким как Map, требуется некоторая специальная логика при де-сериализации, и любая библиотека, которая преобразует POJO в JSON, имеет свою собственную обработку объектов, расширяющих интерфейс Map.

Также SetValuedMap нуждается в такой обработке, так как значения не могут быть непосредственно прочитаны из полей или около того, но с помощью методов put(..) и get(..) (как это делается аналогично в Map).

НО: SetValuedMap не реализует интерфейс Map. Он имеет разницу, например, в типах возвращаемых значений метода put(), и поэтому они «несовместимы» в этом смысле. Это служебный класс от Apache Commons, а не «стандартная Java».

Поэтому Джексон может не иметь ни малейшего понятия, как десериализовать этот класс. Вам может понадобиться написать собственный де / сериализатор для - например - MultiValuedMap.

...