ClassCastException: RestTemplate возвращает список <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, это очень помогло бы. спасибо

Ответ 1

Следующим методом вызова

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();