29

ResponseEntity<T>whereT自体がジェネリック型である場所を取得するのを手伝ってください。私が今見ているように、これは現在、春のRestTemplateではサポートされていません。SpringMVCバージョン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);
4

1 に答える 1

46

これは既知の問題です。これは、実行時に型情報を提供するために明示的に継承する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

thisところで、Java では、インスタンス変数へのアクセスに接頭辞を付ける必要はありurlませんtemplatethis.urlthis.template

于 2012-12-11T12:36:54.697 に答える