클래스캐스트 예외:리스트 대신 리스트 를 반환하는 RestTemplate
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
일치하지 않습니다.누가 이 오류를 없애는 것을 도와줄 수 있습니까?감사해요.
내 모델 클래스
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:
Could not read JSON:
Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
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 Response를 RestTemplate에 매핑하는 방법에 대한 제안이 있다면 많은 도움이 될 것입니다. 감사합니다.
다음 메소드 호출과 함께
List<MyModelClass> myModelClass=(List<MyModelClass>) restTemplate.postForObject(url,mvm,List.class);
잭슨이 아는 건 당신이 원하는 건List
하지만 종류에 제한은 없습니다.기본적으로 Jackson은 JSON 객체를 다음으로 역직렬화합니다.LinkedHashMap
그래서 그것이 당신이 받는 이유입니다.ClassCastException
.
반환된 JSON이 어레이인 경우 어레이를 사용하는 것이 한 가지 방법입니다.
MyModelClass[] myModelClasses = restTemplate.postForObject(url,mvm, MyModelClass[].class);
항상 해당 배열의 요소를 다음에 추가할 수 있습니다.List
.
어떤 버전인지 기억이 안 나지만, 지금은 인수를 받아들이는 오버로드가 있습니다.ParameterizedTypeReference
매개 변수화된 유형을 역직렬화 대상으로 제안하기 위한 유형 토큰 해킹입니다.
위의 코드를 리팩터링하여 사용할 수 있습니다.exchange
대신에postForObject
및 사용ParameterizedTypeReference
a를 얻기 위해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();
다음 메소드 호출을 사용하여 변환할 수 있습니다.LinkedHashMap
로.List
ObjectMapper mapper = new ObjectMapper();
List<Object> list = mapper.convertValue(listResponse, new TypeReference<List<Object>>() {})
언급URL : https://stackoverflow.com/questions/19463372/classcastexception-resttemplate-returning-listlinkedhashmap-instead-of-listm
'programing' 카테고리의 다른 글
테스트를 위해 Forge 서버에 두 번째 Maria DB를 생성하시겠습니까? (0) | 2023.09.02 |
---|---|
mysql order varchar 필드(정수) (0) | 2023.09.02 |
Oracle을 사용한 유닛 테스트 (0) | 2023.09.02 |
Windows에 설치하지 않고 MySQL 실행/시작 (0) | 2023.09.02 |
Laravel의 업로드된 파일에서 이미지 확장명 가져오기 (0) | 2023.09.02 |