web-dev-qa-db-ja.com

ジェネリックResponseEntity <T>を取得できません。Tはジェネリッククラス「SomeClass <SomeGenericType>」です

_ResponseEntity<T>_の取得を手伝ってください。ここで、T自体はジェネリック型です。今のところ、春の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);
_
25
IgorA

これは 既知の問題 でした。 ParameterizedTypeReferenceの導入により修正されました。これは、実行時に型情報を提供するために明示的にinheritするパラメーター化された型です。これはsuper-type tokenと呼ばれ、サブクラス(この場合はanonyymous)がジェネリックのtype引数を保持するため、型消去を回避します実行時のsupertype

ただし、APIは exchange() しかサポートしていないため、postForObjectは使用できません。

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

最後の行は スーパータイプトークン の概念を示していることに注意してください。リテラルCisResponse.classではなく、パラメーター化された型ParameterizedTypeReference<T>を匿名でインスタンス化します。サブタイプ情報の抽出が期待できます。スーパータイプトークンは、Foo<Bar<Baz>>.classを達成するためのhacksと考えることができます

ところで、Javaでは、インスタンス変数へのアクセスの前にthisを付ける必要はありません。オブジェクトがurltemplateを定義している場合メンバーは、this.urlthis.templateのようにプレフィックスを付けるのではなく、単純な名前でアクセスします。

43
Raffaele