@kidar2

Java, Jackson desirialization. Как обработать generec тип на основе интерфейса из java.util?

public class Bla
{
	public SortedSet<Comparable> values;
}


В поле values попадает объект такого класса:

public class ArraySortedSet<E extends Comparable<E>>
    extends AbstractSet<E>
    implements SortedSet<E>, Serializable
{
	
}


Сериализуется нормально.
{
"values": [2]
}

А вот десериализация падает с такой ошибкой:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.lang.Comparable, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information


Как надо настроить Jackson чтобы распарсился json ?
  • Вопрос задан
  • 2829 просмотров
Пригласить эксперта
Ответы на вопрос 2
@gurinderu
java developer
Проблема в том, что у вас нету информации о типе в принципе, потому что List.class не имеет никакой информации о Generic.

Решать такую проблему можно двумя способами:
1. Расширить класс ArrayList, который будет работать не с generic
2. Использовать ObjectWriter (примерно так mapper.writerForType(listType).writeValueAsString())
listType можно сделать через TypeFactory или TypeReference
Ответ написан
Комментировать
DigitalSmile
@DigitalSmile
http://brainstorage.me/digitalsmile
Вроде бы по-русски написали английскими буквами...
Comparable это интерфейс и ему нужна реализация, иначе Jackson не сможет Вам создать объект (куда он будет складывать поля из json?). Найдите (напишите) нужную вам реализацию этого интерфейса и используйте в десерилизации, примерно так:
mapper.readValue(objectJson, mapper.getTypeFactory().constructCollectionType(SortedSet.class, <ВАША РЕАЛИЗАЦИЯ Comparable>))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы