关于java.util.LinkedHashMap cannot be cast to 实体类......问题的出现以及解决办法

在使用RestTemplate调用服务的时候,因为服务提供者返回的是一个List集合,所以在使用消费者调用的时候,restTemplate.getForObject()期待返回的类型直接写成了List.class

	@GetMapping("/list2")
    public List<EmployeeModel> list2() {
        List<EmployeeModel> employeeModels = restTemplate.getForObject("http://SPRINGCLOUD-EMPLOYEE-PROVIDER/emp/list", List.class);
        employeeModels.forEach(System.out::println);
        return employeeModels ;
    }

运行的时候,在遍历的时候,就报了java.util.LinkedHashMap cannot be cast to…这个异常

后来仔细想了一下,调用过程中数据类型的变化:服务提供者返回的是LIst集合,但是标记了@RequestBody,所以返回的时候会把List集合转变成json的形式(内部是jackjson技术支持的)
然后服务消费者使用restTemplate.getForObject(),第二个参数传入接受的类型(就是将响应体中内容以什么类型封装)
如果像上面的写法,就会再把提供者返回的json转变成list,但是这个list跟之前不一样(一个是jackjson转变的,一个是restTemplate转变的,可能内部机制不一样)
所以遍历集合就会报上面的异常

改进方法:

  1. restTemplate.getForObject()以String类型接受,也即接受的是一个json字符串

    // 将响应体内容以String格式接受,即json字符串
    String json = restTemplate.getForObject("http://SPRINGCLOUD-EMPLOYEE-PROVIDER/emp/list",
                    String.class);
    
  2. 再使用阿里巴巴的fastjson将json字符串转变成list集合

    // 将json字符串转集合 
    List<EmployeeModel> employeeModels = JSON.parseArray(json, EmployeeModel.class);
    
  3. 现在就是一个正常的List集合了,可以遍历之类的操作

  4. 以上是自己在学习时个人的理解,如有不对,谢谢指正

  • 18
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值