Intereting Posts
Домашний ключ, обработанный сэндвичем с мороженым Как изменить цвет шрифта в выбранных / сфокусированных элементах ListView? Библиотеки клиентов WebSocket для Java (Android) Как отобразить действие для разрешения, которое начинается с уведомления строки состояния? Утилита RecyclerView на уровне темы Установить файл apk автоматически после загрузки Панель инструментов Android Добавление элементов меню для разных фрагментов Как вызвать метод внутри фрагмента из активности, где динамически создается фрагмент Передача данных из одной активности в другую с помощью пакета – не отображение во второй активности Как показать значок apk в моем диспетчере файлов Отправьте SMS с помощью Sinch (Android) Android, сделайте текст анимации прокручивающимся на экране, как первая часть Star Wars Раскрывающиеся окна для раскрутки на Twitter View.isHardwareAccelerated () всегда false Блокировать устройство Android

ClassCastException: RestTemplate возвращает List <LinkedHashMap> вместо списка <MymodelClass>

Я пытаюсь получить доступ к методам getter на моем MyModelClass, но мой код возвращает List<LinkedHashMap> вместо List<MyModelClass> . Это мой код.

 List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class); System.out.println("Response= " + myModelClass); 

Я попытался напечатать ответ, и я получил ответ JSON, которого ожидаю. Но когда я попытался запустить этот код.

 System.out.println("Response= " + myModelClass.get(0).getMessage()); 

Это приведет к ошибке.

 java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.XXX.XXX.MyModelClass 

Это несоответствие. Может ли кто-нибудь помочь мне избавиться от этой ошибки? Благодарю.

MyModelClass

 public class MyModelClass{ /** * */ @JsonProperty("id") public String id; @JsonProperty("type") public String type; @JsonProperty("user") public String user; @JsonProperty("message") public String message; //getters 

Ошибка для

 MyModelClass[] myModelClass= restTemplate.postForObject(url,mvm, myModelClass[].class); 

Org.springframework.http.converter.HttpMessageNotReadableException: не удалось прочитать JSON: невозможно десериализовать экземпляр java.util.ArrayList из токена START_OBJECT

Структура ответа JSON

  [{"key1":"value1","key2":"value2","parameters":{"key1":"value1","key2":"value2","key3":"value3","key4":"value4","key5":"value5"}}, {"key12":"value12","key22":"value22","parameters":{"key12":"value12","key22":"value22","key32":"value32","key42":"value42","key52":"value52"}}] 

Если есть какое-либо предложение о том, как сопоставить этот вид ответа JSON в RestTemplate, это очень поможет. благодаря

При следующем вызове метода

 List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class); 

Все, что Джексон знает, это то, что вы хотите List , но не имеете никаких ограничений по типу. По умолчанию Джексон десериализует объект JSON в LinkedHashMap , поэтому вы получаете ClassCastException .

Если ваш возвращенный JSON является массивом, один из способов получить его – использовать массив

 MyModelClass[] myModelClasses = restTemplate.postForObject(url,mvm, MyModelClass[].class); 

Вы всегда можете добавить элементы из этого массива в List .

Я не могу вспомнить, с какой версией, но RestTemplate#exchange теперь имеет перегрузку, которая принимает аргумент ParameterizedTypeReference . ParameterizedTypeReference – это маркер типа token, предлагающий параметризованный тип в качестве цели для десериализации.

Вы можете реорганизовать код выше, чтобы использовать exchange вместо postForObject , и использовать ParameterizedTypeReference для получения List<MyModelClass> . Например

 ParameterizedTypeReference<List<MyModelClass>> typeRef = new ParameterizedTypeReference<List<MyModelClass>>() { }; ResponseEntity<List<MyModelClass>> responseEntity = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(mvm), typeRef); List<MyModelClass> myModelClasses = responseEntity.getBody();