Не удается найти десериализатор ключа (Map) для типа [простой тип, класс com.comcast.ivr.core.domain.AutoHandlingSlotKey] - PullRequest
38 голосов
/ 16 июня 2011

У меня есть доменный объект с картой:

private Map<AutoHandlingSlotKey, LinkedHashSet<AutoFunction>> autoHandling;

Когда я сериализую объект, я получаю это:

"autoHandling" : [ "java.util.HashMap", {
} ],

Ключ этой карты является пользовательским объектом:

public class AutoHandlingSlotKey implements Serializable {
    private FunctionalArea slot; // ENUM
    private String returnView;   // ENUM

Итак, я не уверен, как исправить эту проблему, которую я продолжаю получать при десериализации объекта:

org.codehaus.jackson.map.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class com.comcast.ivr.core.domain.AutoHandlingSlotKey]

Может ли кто-нибудь помочь мне понять, как исправить эту проблему, если я НЕ имеет доступ к объекту домена для изменения?

Ответы [ 2 ]

24 голосов
/ 26 мая 2017

Это было задано давно, и это первый результат Google при поиске ошибки, но принятый ответ не имеет кода и может сбить с толку новичка Джексона (меня). В конце концов я нашел этот ответ , который помог.

Итак, как указано в принятом ответе, внедрение и регистрация «ключевого десериализатора» - это путь. Вы можете сделать это следующим образом.

SimpleModule simpleModule = new SimpleModule();
simpleModule.addKeyDeserializer(YourClass.class, new YourClassKeyDeserializer());
objectMapper.registerModule(simpleModule);

А для класса все, что вам нужно сделать, это:

class YourClassKeyDeserializer extends KeyDeserializer
{
    @Override
    public Object deserializeKey(final String key, final DeserializationContext ctxt ) throws IOException, JsonProcessingException
    {
        return null; // replace null with your logic
    }
}

Вот и все! Нет аннотаций на классы, не пользовательский десериализатор для карт и т. Д.

21 голосов
/ 16 июня 2011

По умолчанию Джексон пытается сериализовать Java Maps как JSON Objects (пары ключ / значение), поэтому объект ключа Map должен быть каким-то образом сериализован как String; и должен быть соответствующий (и зарегистрированный) ключ десериализатора. Конфигурация по умолчанию поддерживает только небольшой набор типов JDK (String, numbers, enum). Поэтому mapper не имеет представления о том, как взять String и создать из него AutoHandlingSlotKey. (на самом деле я удивлен, что сериализатор не вышел из строя по той же причине)

Два очевидных способа решения этой проблемы:

  • Реализация и регистрация "десериализатора ключей"
  • Реализация и регистрация настраиваемого десериализатора для Карт.

В вашем случае, вероятно, проще сделать первое. Возможно, вы также захотите внедрить пользовательский сериализатор ключей, чтобы ключи были сериализатором в правильном формате.

Самым простым способом регистрации сериализаторов и десериализаторов является Интерфейс модуля , который был добавлен в Jackson 1.7 (и расширен в 1.8 для поддержки ключевых сериализаторов / десериализаторов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...