java - 正确使用 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 方法无法解析,因为类型不匹配。
交换方法的问题是类型不兼容。必需的列表,但“交换”被推断为 ResponseEntity:不存在类型变量的实例,因此 ResponseEntity 符合 List
在这种情况下如何正确使用 ParameterizedTypeReference 来安全地返回我想要的 List 类型?
解决方案
从文档中:
对给定的 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();
推荐阅读
- python - 我可以用空单元格“展平”一列吗?
- r - 如何确定主键?
- python - Jupyter Notebook 的不确定运行时
- javascript - 当我将光标放在输入上时,在输入中模拟 ArrowDown
- postgresql - 我可以扩展 postgres 将字符串转换为 UUID 的方法吗?
- r - 制作比修拉更好看的树状图的方法?
- javascript - 如何修复 RichEmbed Discord.js
- jquery - jQuery ajax 在 ajax 结果中查找匹配项
- sql - MS SQL SERVER 在从池中获取连接之前经过的超时时间
- r - 转换 Python 列表并将其存储在 R 环境中。所以我可以使用 rpy2.objects.r() 访问列表