Подтвердить что ты не робот

Не удалось получить общий ResponseEntity <T>, где T - общий класс "SomeClass <SomeGenericType>"

Пожалуйста, помогите мне получить ResponseEntity<T>, где T сам по себе является общим типом. Как я вижу сейчас, это не поддерживается в настоящее время spring RestTemplate. Я использую spring 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);
4b9b3361

Ответ 1

Это была известная проблема. Теперь он исправлен с введением ParameterizedTypeReference, который является параметризованным типом, который вы явно наследуете для предоставления информации о типе во время выполнения. Это называется маркером супертипа и работает с тире стирания, потому что подклассы (в этом случае анонимы) хранят аргументы типа универсального супертипа во время выполнения.

Однако вы не можете использовать postForObject, потому что API поддерживает только exchange():

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

Обратите внимание, что последняя строка демонстрирует идею маркеров супертекста: вы не поставляете литерал CisResponse.class, но анонимный экземпляр параметризованного типа ParameterizedTypeReference<T>, который во время выполнения можно ожидать, чтобы извлечь информацию о подтипе. Вы можете думать о маркеры супер-типа, как взломы для достижения Foo<Bar<Baz>>.class

BTW, в Java вам не нужно префикс доступа к переменной экземпляра с помощью this: если ваш объект определяет членов url и template, просто обращайтесь к ним с их простым именем, а не с помощью префикса вы делаете this.url и this.template