ジェネリックメソッドでSpring RestTemplateをジェネリックパラメータで使用する
質問
Spring RestTemplateでジェネリックタイプを使用するためには
ParameterizedTypeReference
(
Unable to get a generic ResponseEntity<T> where T is a generic class "SomeClass<SomeGenericType> ".ここで、Tはジェネリッククラスです。
)
あるクラスがあるとします。
public class MyClass {
int users[];
public int[] getUsers() { return users; }
public void setUsers(int[] users) {this.users = users;}
}
そして、いくつかのラッパークラス
public class ResponseWrapper <T> {
T response;
public T getResponse () { return response; }
public void setResponse(T response) {this.response = response;}
}
という感じで、こんな感じでやっていれば万事OKです。
public ResponseWrapper<MyClass> makeRequest(URI uri) {
ResponseEntity<ResponseWrapper<MyClass>> response = template.exchange(
uri,
HttpMethod.POST,
null,
new ParameterizedTypeReference<ResponseWrapper<MyClass>>() {});
return response;
}
しかし、上記のメソッドのジェネリックバリアントを作ろうとすると ...
public <T> ResponseWrapper<T> makeRequest(URI uri, Class<T> clazz) {
ResponseEntity<ResponseWrapper<T>> response = template.exchange(
uri,
HttpMethod.POST,
null,
new ParameterizedTypeReference<ResponseWrapper<T>>() {});
return response;
}
... そして、このメソッドを以下のように呼び出します。
makeRequest(uri, MyClass.class)
... 代わりに
ResponseEntity<ResponseWrapper<MyClass>>
オブジェクトを取得します。
ResponseEntity<ResponseWrapper<LinkedHashSet>>
オブジェクトが表示されます。
この問題を解決するにはどうすればよいですか?それはRestTemplateのバグですか?
アップデイト1
Sotiriosのおかげでコンセプトが理解できました。残念ながら、私はここに新しく登録したので、彼の答えにコメントできないので、ここに書きます。私は私の問題を解決するために提案されたアプローチを実装する方法を明確に理解していることを確信していません。
Map
で
Class
キー(彼の答えの最後で@Sotiriosによって提案された)。誰かが例を与えることを気にしますか?
どのように解決するのですか?
いいえ、バグではありません。これは
ParameterizedTypeReference
ハックが機能する結果です。
その実装を見てみると
Class#getGenericSuperclass()
という記述があります。
このクラスが表現する実体 (クラス、インターフェース、プリミティブ型、またはvoid)の直接のスーパークラスを表す型を返します。
スーパークラスがパラメタライズドタイプである場合。 は
Type
オブジェクトが返されます。 は、ソースコードで使われた実際の型パラメータを正確に反映したものでなければなりません。 を正確に反映していなければなりません。
ということは、もしあなたが
new ParameterizedTypeReference<ResponseWrapper<MyClass>>() {}
を返すと、正確に
Type
に対して
ResponseWrapper<MyClass>
.
を使用する場合
new ParameterizedTypeReference<ResponseWrapper<T>>() {}
を返すと、正確に
Type
に対して
ResponseWrapper<T>
というのは、ソースコードにそのように表示されるからです。
Springが
T
を見ると、それは実際には
TypeVariable
オブジェクトであり、使用する型を知らないので、デフォルトを使用します。
を使うことはできません。
ParameterizedTypeReference
をどのような型でも受け入れるという意味で一般的にすることはできません。を書くことを考えましょう。
Map
をキーとして
Class
は、あらかじめ定義された
ParameterizedTypeReference
にマップされます。
をサブクラス化することができます。
ParameterizedTypeReference
をオーバーライドし、その
getType
メソッドをオーバーライドして、適切に作成された
ParameterizedType
,
IonSpinが提案したように
.
関連
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み] C#でジェネリックメソッドからNULLを返すにはどうしたらいいですか?
-
[解決済み] Spring RestTemplateのパラメータ付きGET
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
-
[解決済み] Spring RestTemplateでフォームデータをPOSTする方法は?
-
[解決済み】Spring RestTemplateでJSONオブジェクトの一覧を取得する。
-
Spring RESTTemplateを使ったジェネリック
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
Javaでよくある構文エラー
-
Java の switch case 文で必要な定数式の問題の解決法
-
プロジェクトの依存関係を解決できない。
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
アクセス制限の解決方法: ---- in Java
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。