Подтвердить что ты не робот

Невозможно найти дескриптор (Map) Key для типа [простой тип, класс com.comcast.ivr.core.domain.AutoHandlingSlotKey]

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

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]

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Это было задано давно, и это первый результат 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
    }
}

Что это! Нет аннотации к классам, а не пользовательский десериализатор для карт и т.д.