ClassCastException:RestTemplate返回List <LinkedHashMap>而不是List <MymodelClass>

我试图访问我的MyModelClass getter方法,但我的代码是返回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"}}] 

如果有任何关于如何在RestTemplate中映射这种JSON响应的build议,这将有很大的帮助。 谢谢

Solutions Collecting From Web of "ClassCastException:RestTemplate返回List <LinkedHashMap>而不是List <MymodelClass>"

用下面的方法调用

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

jackson所知道的是你想要一个List ,但是对这个types没有任何限制。 默认情况下,Jackson将一个JSON对象反序列化为一个LinkedHashMap ,所以这就是为什么你得到了ClassCastException

如果返回的JSON是一个数组,获取它的一种方法是使用一个数组

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

您始终可以将该数组中的元素添加到List

我不记得,因为什么版本,但RestTemplate#exchange现在有一个接受ParameterizedTypeReference参数的重载。 ParameterizedTypeReferencetypes引用是用于build议参数化types作为反序列化目标的types令牌hack。

您可以重构上面的代码来使用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();