如何从 Spring RestTemplate 中的对象获取列表
Posted
技术标签:
【中文标题】如何从 Spring RestTemplate 中的对象获取列表【英文标题】:How to get List from Object in Spring RestTemplate 【发布时间】:2018-09-19 23:38:27 【问题描述】:如何从对象中获取列表?您可以在下面找到我的代码:
ResponseEntity<Object> responseEntity = restTemplate.getForEntity("localhost:8083/connectors/", Object.class);
Object object = responseEntity.getBody();
实际上对象变量是一个对象列表(字符串),我需要获取所有这些字符串。
如果我把它打印出来 System.out.println(object.toString());
它看起来像这样:
[objvar, values, test, object, servar, larms, aggregates, sink, records]
我需要获取这些字符串的列表以动态使用它。你能帮忙吗?
【问题讨论】:
使用列表代替对象 【参考方案1】:试试这个。这应该有效。
ResponseEntity<String[]> responseEntity = restTemplate.getForEntity("localhost:8083/connectors/", String[].class);
List<String> object = Arrays.asList(responseEntity.getBody());
对于简单的情况,上面的代码可以工作,但是当你有复杂的 json 结构要映射时,使用 ParameterizedTypeReference 是理想的。
ResponseEntity<List<String>> responseEntity =
restTemplate.exchange("localhost:8083/connectors/",
HttpMethod.GET, null, new ParameterizedTypeReference<List<String>>()
);
List<String> listOfString = responseEntity.getBody();
【讨论】:
如果我使用 ResponseEntity> 有一个问题Type mismatch: cannot convert from ResponseEntity<List> to ResponseEntity<List<String>>
我可以把 List of String 改为 List is a raw type. References to generic type List<E> should be parameterized
和第二行 Type safety: The expression of type List needs unchecked conversion to conform to List<String>
关于第一种方式,您使用原始类型。当getBody()
被调用时,您如何检索List<String>
?我一般用第二种方式。
@Tom 我认为第一种方法无效。而是使用第二个。
@davidxxx,感谢您指出。汤姆我已经更新了我的答案。看看吧。
@pvpkiran 好多了。 ParameterizedTypeReference
是非常好的替代品。你当然有我的投票:)【参考方案2】:
如果您确定此对象将始终为 List
,则将其强制转换
List<?> lst= (List) responseEntity.getBody();
但是,您不能直接将其转换为List<String>
,因此您必须通过循环或流检查元素类型以生成类型化列表。
使用的 API 可以通过什么方式返回实际类型?
【讨论】:
【参考方案3】:你可以试试这个解决方法
List list = java.util.Arrays.asList(object.toString());
或者,您可以使用类似的库 ObjectMapper, 它直接将 json 字符串转换为您想要的模型
【讨论】:
【参考方案4】:如果使用 jwt 进行授权,然后想要检索一个列表,请遵循代码:
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
// set `content-type` header
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
// request body parameters
Map<String, String> map = new HashMap<>();
map.put("email", "abc@email.com");
map.put("password", "pass123");
// build the request
HttpEntity<Map<String, String>> entity = new HttpEntity<>(map, headers);
// send POST request
ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8080/user/login", entity, String.class);
HttpHeaders myHeader = new HttpHeaders();
myHeader.add("User-Agent", "Spring's RestTemplate" );
myHeader.set("Authorization","Bearer "+response.getBody());
HttpEntity<String> request = new HttpEntity<>(myHeader);
ResponseEntity<Product[]> responseEntity = restTemplate.exchange("http://localhost:8080/secure/products", HttpMethod.GET, request, Product[].class);
List<Product> object = Arrays.asList(responseEntity.getBody());
System.out.println(object);
【讨论】:
【参考方案5】:这对你有用:
ResponseEntity<Object[]> responseEntity = restTemplate.getForEntity("localhost:8083/connectors/", Object[].class);
List<Object> responseList = Arrays.asList(responseEntity.getBody());
(List[] 而不是 Object[] 也是如此)
【讨论】:
很遗憾不是Type mismatch: cannot convert from ResponseEntity<Object> to ResponseEntity<Object[]>
@tom,你是否也添加了 Object[]?以上是关于如何从 Spring RestTemplate 中的对象获取列表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring RestTemplate 中记录响应?
Spring restTemplate 获取原始 json 字符串
Spring Boot:如何使用 WebClient 而不是 RestTemplate 来执行非阻塞和异步调用
如何使用 spring 记录 RestTemplate 请求和响应?
如何在 Java Spring boot 中模拟 RestTemplate?
如何使用 RestTemplate 在 Spring MVC 应用程序中访问来自(来自 Spring RESTful 服务)的巨大 JSON