복붙노트

[SPRING] ClassCastException : List <MymodelClass> 대신 List <LinkedHashMap>를 반환하는 RestTemplate

SPRING

ClassCastException : List 대신 List 를 반환하는 RestTemplate

내 MyModelClass에 getter 메서드에 액세스하려고하는데 내 코드가 List 대신 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. ==============================

    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. ==============================

    2.그리고 generics가 필요한 매개 변수화 목록이 필요한 경우이 대답을보십시오 Spring RestTemplate 및 generic 유형 List 와 같은 ParameterizedTypeReference 컬렉션

    그리고 generics가 필요한 매개 변수화 목록이 필요한 경우이 대답을보십시오 Spring RestTemplate 및 generic 유형 List 와 같은 ParameterizedTypeReference 컬렉션

  3. from https://stackoverflow.com/questions/19463372/classcastexception-resttemplate-returning-listlinkedhashmap-instead-of-listm by cc-by-sa and MIT license