programing

클래스캐스트 예외:리스트 대신 리스트를 반환하는 RestTemplate

testmans 2023. 9. 2. 08:05
반응형

클래스캐스트 예외:리스트 대신 리스트를 반환하는 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및 사용ParameterizedTypeReferencea를 얻기 위해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

반응형