web-dev-qa-db-ja.com

ParameterizedTypeReferenceの正しい使用法

テストでは、タイプのリストを返すエンドポイントをヒットしたいと思います。現在私は持っています

@Test
public void when_endpoint_is_hit_then_return_list(){
   //Given
   ParameterizedTypeReference<List<Example>> responseType = new ParameterizedTypeReference<List<Example>>() {};

   String targetUrl = "/path/to/hit/" + expectedExample.getParameterOfList();

   //When

   //This works however highlights an unchecked assignment of List to List<Example>
   List<Example> actualExample = restTemplate.getForObject(targetUrl, List.class);

   //This does not work
   List<Example> actualExample = restTemplate.getForObject(targetUrl, responseType);

   //This does not work either
   List<Example> actualExample = restTemplate.exchange(targetUrl, HttpMethod.GET, null, new ParameterizedTypeReference<List<Example>>() {});

   //Then
   //Assert Results
}

GetForObjectメソッドの問題は、型が一致しないため、ParameterizedTypeReferenceによってgetForObjectメソッドが解決されないことです。

交換メソッドの問題は、互換性のないタイプです。必須のリストですが、 'exchange'がResponseEntityに推論されました:タイプの変数のインスタンスが存在しないため、ResponseEntityはListに準拠します

この状況でParameterizedTypeReferenceを正しく使用して、必要なListタイプを安全に返すにはどうすればよいですか?

5
shirafuno

ドキュメント から:

指定されたURIテンプレートに対してHTTPメソッドを実行し、指定されたリクエストエンティティをリクエストに書き込み、レスポンスをResponseEntityとして返します。指定されたParameterizedTypeReferenceは、ジェネリック型情報を渡すために使用されます。

ParameterizedTypeReference<List<MyBean>> myBean =
   new ParameterizedTypeReference<List<MyBean>>() {};

ResponseEntity<List<MyBean>> response =
   template.exchange("http://example.com",HttpMethod.GET, null, myBean);

したがって、あなたの場合は次のことができます:

ResponseEntity<List<Example>> actualExample = restTemplate.exchange(targetUrl, HttpMethod.GET, null, new ParameterizedTypeReference<List<Example>>() {});
List<Example> exampleList = actualExample.getBody();
7