2011-12-14 9 views
5

私はSpringのRestTemplateを使ってREST Webサービスを呼び出しています。これらの呼び出しの1つは、特定のタイプのオブジェクトのリストを返すことです。 RestTemplateメソッドでは、期待される戻り値の型を示すためにclass引数を指定する必要があります。ジェネリック型の情報が利用できない場合、コンパイラの警告を避けるにはどうすればよいですか?

// restTemplate is type org.springframework.web.client.RestTemplate 
URI restServiceURI = new URI("http://example.com/foo") 
restTemplate.getForObject(restServiceURI, List<Foo>.class); 

明らかに、これはコンパイルされません。そのような型引数を指定すると、静的な.classプロパティを取得することはできません。型引数を削除すると、コードがコンパイルされますが、それはrawtypesコンパイラ警告を生成します。

私の質問は簡単です。私はコンパイラの警告を抑制することに固執しているのですか、これをコード化するためのよりクリーンな方法がありますか?

答えて

3

しかし、どのようにRestTemplateは知っているだろうリスト要素をクラスFooのインスタンスに変換しますか?コードを実行しようとしましたが、期待どおりに動作しますか?

私はこれを取り巻くことを考えてもよい方法の1つは、入力型として配列を使用することです。例えば。

restTemplate.getForObject(restServiceURI, Foo[].class); 

しかし、それがサポートされているかわかりません。より複雑なデータ型を逆シリアル化する必要がある場合は、JacksonまたはGsonの使用を検討する必要があります。

ObjectMapperクラスを使用すると、ほとんどのソースから簡単にデシリアライズできます。

String input = ...; 
ObjectMapper mapper = new ObjectMapper(); 
List<Foo> list = mapper.readValue(input, new TypeReference<List<Foo>>(){}); 

上記の作品あなたが意図的にTypeReferenceを拡張する匿名クラスを作成しているため、このクラスは、実行時にそのジェネリック型を覚えているだろうし、それはFooののリストを作成するために、オブジェクトマッパーを助けることができます。 For a fuller explanation

+0

Jacksonはクラスパス上にあり、Spring 3.xはそれらのストリームをマーシャル/アンマーシャリングするために自動的に使用します。私はそれを私の利点に利用したいと考えていましたが、私はこれをより低いレベルで行う必要があるように見えます。私はSpringが他のテンプレートクラスと同様にCollectionのリターンを処理する簡単な方法を提供していないことに驚いています。 –

+0

この方法は、洗練されています。 RestTemplate.getForObject()を使用するのではなく、RestTemplate.execute()を使用して、私自身のResponseExtractorを提供しています。これは概念の証明を通じて私を得るが、私は、サーバーからの応答の種類を決定するより巧妙な方法があると思います。今はJSONを想定していますが、XMLをサポートする必要があります。方向をありがとう! –

0

あなたはこれを使用して達成することができます:

List<Class<Foo>> classList = new ArrayList<Class<Foo>>(); 
restTemplate.getForObject(restServiceURI, classList); 

それだけで一つのオブジェクトではなくクラスのリストであれば、あなたはこのように渡すことができます。

restTemplate.getForObject(restServiceURI, Foo.class); 
+0

推奨される方法でコンパイルエラーが発生します。 –

関連する問題