[SPRING] ClassCastException : List <MymodelClass> 대신 List <LinkedHashMap>를 반환하는 RestTemplate
SPRINGClassCastException : List 대신 List 를 반환하는 RestTemplate
내 MyModelClass에 getter 메서드에 액세스하려고하는데 내 코드가 List
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을 읽을 수 없습니다 : START_OBJECT 토큰에서 java.util.ArrayList의 인스턴스를 deserialize 할 수 없습니다.
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 응답을 매핑하는 방법에 대한 제안이 있다면, 많은 도움이 될 것입니다. 감사
해결법
-
==============================
1.다음 메소드 호출
다음 메소드 호출
List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);
모든 Jackson은 목록을 원한다는 것을 알고 있지만 유형에 대한 제한은 없습니다. 기본적으로 Jackson은 JSON 객체를 LinkedHashMap으로 비 직렬화하므로 ClassCastException이 발생합니다.
반환 된 JSON이 배열 인 경우 가져 오기위한 한 가지 방법은 배열을 사용하는 것입니다.
MyModelClass[] myModelClasses = restTemplate.postForObject(url,mvm, MyModelClass[].class);
해당 배열의 요소를 항상 List에 추가 할 수 있습니다.
어떤 버전부터 기억이 나지 않지만 RestTemplate # exchange에는 ParameterizedTypeReference 인수를 허용하는 오버로드가 있습니다. ParameterizedTypeReference는 매개 변수화 된 형식을 deserialization 대상으로 제안하는 형식 토큰 해킹입니다.
위의 코드를 리팩터링하여 postForObject 대신 exchange를 사용하고 ParameterizedTypeReference를 사용하여 List
를 가져올 수 있습니다. 예를 들어 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();
-
==============================
2.그리고 generics가 필요한 매개 변수화 목록이 필요한 경우이 대답을보십시오 Spring RestTemplate 및 generic 유형 List
와 같은 ParameterizedTypeReference 컬렉션 그리고 generics가 필요한 매개 변수화 목록이 필요한 경우이 대답을보십시오 Spring RestTemplate 및 generic 유형 List
와 같은 ParameterizedTypeReference 컬렉션
from https://stackoverflow.com/questions/19463372/classcastexception-resttemplate-returning-listlinkedhashmap-instead-of-listm by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] HibernateValidator를 사용하여 크로스 필드 유효성 검사가 오류 메시지를 표시하지 않습니다. (0) | 2019.01.12 |
---|---|
[SPRING] 필수 스프링에서 동일한 유형의 여러 빈 (0) | 2019.01.12 |
[SPRING] logback.xml에 Spring 속성 자리 표시자를 사용할 수 없습니다. (0) | 2019.01.12 |
[SPRING] Jackson - 400 잘못된 요청 로깅을 사용하는 Spring REST (0) | 2019.01.12 |
[SPRING] 시스템 속성을 Gradle 작업에 전달하는 방법 (0) | 2019.01.12 |