Невозможно найти дескриптор (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]
Может ли кто-нибудь помочь мне понять, как исправить эту проблему, если у меня НЕ есть доступ к объекту домена для изменения?
Ответы
Ответ 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
}
}
Что это! Нет аннотации к классам, а не пользовательский десериализатор для карт и т.д.