spring cloude 使用fegin远程调用接口返回了linkedHashMap的问题

作者情况描述:
最近在使用微服务进行服务之间的调用,通过fegin client调用时出现的问题

  1. 接口服务方返回参数:
    接口层封装返回的对象 Result
    接口
    实现层返回的对象 DeviceVo
    接口实现层返回的对象
  2. 接口调用方放回值类型:Result
    在这里插入图片描述
    1. 调用后返回的对象:Result,注意此时的data对象为LinkedHashMap
      在这里插入图片描述
      并显示报错信息:
[java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.springboot.cloud.business.trade.service.entity.po.OrderDevice]

这里由原本返回的对象转换成了LinkedHashMap,具体原因是因为:
因为rpc远程调用在底层还是使用的HTTPClient,所以在传递参数的时候,必定要有个顺序,当你传递map的时候map里面的值也要有顺序,不然服务层在接的时候就出问题了,所以它才会从map转为linkedhashMap!spring 有一个类叫ModelMap,继承了linkedhashMap public class ModelMap extends LinkedHashMap ,所以一个接口返回的结果就可以直接用ModelMap来接,注意ModelMap是没有泛型的,不管你返回的结果是什么类型的map,泛型是多复杂的map,都可以直接new一个Modelmap,用它来接返回的结果!!!

  • 所以在修改的时候需要在调用方用fegin 调用的时候加上返回对象泛型就能解决此问题了

  • 解决如下:
    在这里插入图片描述
    在这里插入图片描述
    这里返回的直接是该泛型对象转换后的值,完美解决!不过特别注意的是:

    注意:如果存在时间为DATE类型的字段的时候,调用方需要使用String来接收该时间字段
    如果你的时间存在时差问题。那是因为:
    Feign客户端在进行通信时,会将Date类型对象转为String类型,如果这个时间是北京时间2019年2月19日20点30分,因为中国的时区叫做CTS,所以转化后的String为“Tue Feb 19 20:30:00 CST 2019”. 服务端将接收的String类型日期转换为Date类型,转换采用的是Date的默认构造器new Date(‘Tue Feb 19 20:30:00 CST 2019’),这里就是错误发生的时刻,因为CTS代表的时区其实有四个(Central Standard Time (USA) UT-6:00、Central Standard Time (Australia) UT+9:30、China Standard Time UT+8:00、Cuba Standard Time UT-4:00),同时表示美国,澳大利亚,中国,古巴四个国家的标准时间。根据JavaDoc,jvm会将CTS理解成了美国中部时区,因此造成了时区错误。
    解决方法:

  • 使用String类型作为参数,

  • 在接收方进行类型转换 使用JDK8中的LocalDate

  • 第三种方法增加配置类,使Feign使用自定义的规则转换


so,是不是该反手就要点个赞呢 --》嘿哈哈哈–》

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焚目圣僧渡众生

你的 一角将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值