복붙노트

[SPRING] 일반 ResponseEntity <T>를 가져올 수 없습니다. 여기서 T는 제네릭 클래스 "SomeClass <SomeGenericType>"입니다.

SPRING

일반 ResponseEntity 를 가져올 수 없습니다. 여기서 T는 제네릭 클래스 "SomeClass "입니다.

ResponseEntity 를 얻을 수 있도록 도와주세요. 여기서 T는 그 자체가 일반적인 유형입니다. 내가 지금 보았 듯이, 봄 RestTemplate에 의해 지금은 지원되지 않습니다. 스프링 MVC 버전 3.1.2를 사용하고 있습니다.

다음은 사용하고자하는 코드입니다. 암호:

ResponseEntity<CisResponse<CisResponseEntity>> res =
         this.restTemplate.postForEntity(
             this.rootURL, myRequestObj, CisResponse.class);

이 오류가 발생합니다.

Type mismatch: cannot convert from ResponseEntity<CisResponse> to
ResponseEntity<CisResponse<CisResponseEntity>>

그것은 명백한 오류지만, 오늘 어떻게 해결할 수 있습니까?

내 일반적인 응답 유형을 얻고 싶습니다.

CisResponse<CisResponseEntity> myResponse= res.getBody();
CisResponseEntity entity = myResponse.getEntityFromResponse();

지금은 postForObject ()가 아닌 postForEntity ()와 함께이 솔루션을 사용합니다.

CisResponse<CisResponseEntity> response = 
          this.restTemplate.postForObject(
               this.rootURL,myRequestObj, CisResponse.class);

해결법

  1. ==============================

    1.이는 알려진 문제입니다. 이제는 런타임에 유형 정보를 명시 적으로 상속받는 매개 변수화 된 유형 인 ParameterizedTypeReference가 도입되어 해결되었습니다. 이는 수퍼 유형 토큰이라고하며, 서브 클래스 (이 경우에는 불리언)가 런타임시 일반 수퍼 유형의 유형 인수를 유지하므로 유형 지우기를 해결합니다.

    이는 알려진 문제입니다. 이제는 런타임에 유형 정보를 명시 적으로 상속받는 매개 변수화 된 유형 인 ParameterizedTypeReference가 도입되어 해결되었습니다. 이는 수퍼 유형 토큰이라고하며, 서브 클래스 (이 경우에는 불리언)가 런타임시 일반 수퍼 유형의 유형 인수를 유지하므로 유형 지우기를 해결합니다.

    그러나 API는 exchange () 만 지원하기 때문에 postForObject를 사용할 수 없습니다.

    ResponseEntity<CisResponse<CisResponseEntity>> res = template.exchange(
            rootUrl,
            HttpMethod.POST,
            null,
            new ParameterizedTypeReference<CisResponse<CisResponseEntity>>() {});
    

    마지막 줄에는 수퍼 유형 토큰에 대한 개념이 나와 있습니다. 즉, 리터럴 CisResponse.class를 제공하지 않고 런타임에 하위 유형 정보를 추출 할 수있는 매개 변수화 된 유형 ParameterizedTypeReference 를 익명으로 인스턴스화합니다. 슈퍼 타입 토큰은 Foo >를 달성하기위한 해킹이라고 생각할 수 있습니다.

    BTW, Java에서는 인스턴스 변수에 대한 접두사를 접두어로 사용할 필요가 없습니다. 객체가 URL 및 템플릿 멤버를 정의하는 경우 this와 같은 접두사가 아닌 간단한 이름으로 액세스하십시오 .url 및 this.template

  2. from https://stackoverflow.com/questions/13819734/unable-to-get-a-generic-responseentityt-where-t-is-a-generic-class-someclass by cc-by-sa and MIT license