restTemplate返回值问题
来源:6-4 Ribbon组成

小屁孩丶
2019-08-27
调用服务方代码:
ServiceMultiResult serviceResult = this.restTemplate.postForObject(“http://search-center/search”, rentSearch, ServiceMultiResult.class);
被调用方代码:
@PostMapping(“search”)
public ServiceMultiResult query(@RequestBody RentSearch rentSearch) {
return searchService.query(rentSearch);
}
明明返回泛型是Long类型的结果,但是下面代码遍历的时候,出现错误:java.lang.Integer cannot be cast to java.lang.Long
写回答
1回答
-
您好,很棒的问题!这其实是RestTemplate里面很容易踩到的一个坑。不过课上用不到这个知识点,而且RestTemplate本身也是Spring Web的基础,所以视频里没有讲。
对于泛型,getForObject/getForEntity支持得并不好。你得像下面这么玩。我花了点时间准备了完整的例子:
服务提供者:
@RestController public class UserController { @GetMapping("/test") public Result test() { List<Integer> integers = Arrays.asList(1, 2, 3, 4); Result<Integer> result = new Result<>(); result.setResult(integers); result.setTotal(4L); return result; } } @Data @AllArgsConstructor @NoArgsConstructor @Builder class Result<T> { private List<T> result; private Long total; }
服务消费者:
@RestController public class MovieController { @Autowired private RestTemplate restTemplate; @GetMapping("/test") public Result findById() throws URISyntaxException { // 用这个玩意儿支持泛型 ParameterizedTypeReference<Result<Long>> parameterizedTypeReference = new ParameterizedTypeReference<Result<Long>>() { }; Result<Long> result = this.restTemplate.exchange( // 改成服务提供者的服务名称或具体地址 new URI("http://user-center/test"), HttpMethod.GET, null, parameterizedTypeReference ).getBody(); List<Long> list = result.getResult(); for (Long item : list) { System.out.println(item); } Long total = result.getTotal(); return result; } } @Data @AllArgsConstructor @NoArgsConstructor @Builder class Result<T> { private List<T> result; private Long total; }
112019-08-27
相似问题