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回答

大目

2019-08-27

您好,很棒的问题!这其实是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;
}


1
1
小屁孩丶
谢谢老师,自己试了很长时间,没有解决,厉害!!!
2019-08-27
共1条回复

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3085 学习 · 1324 问题

查看课程