_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);
_
これは 既知の問題 でした。 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
を付ける必要はありません。オブジェクトがurl
とtemplate
を定義している場合メンバーは、this.url
やthis.template
のようにプレフィックスを付けるのではなく、単純な名前でアクセスします。