通过feign传输localdatetime字段的时候丢失精度的问题

5 篇文章 0 订阅
3 篇文章 1 订阅

通过feign传输localdatetime字段的时候丢失精度的问题

通过feign传输localdatetime字段的时候丢失精度的问题

场景:A服务调用到B服务操作,通过Feign需要传递string参数和localdatetime参数过去,在测试的时候发现时间始终对不上。通过dubug后发现A服务传递的localdatetime参数正常,但是B服务接收到localdatetime参数缺失了"秒"

请求侧A服务原代码:

    @RequestMapping(path = "/getRamrkByTaskId", method = RequestMethod.POST)
    public Result<List<RemarkRecords>> getRemarkByTaskId(@RequestParam(name = "taskId") String taskId, @RequestParam(name = "callTime") @DateTimeFormat() LocalDateTime callTime);

被调用侧B服务原代码:

@RequestMapping(value = "/getRamrkByTaskId", method = RequestMethod.POST)
    public Result<List<RemarkRecords>> getRamrkByTaskId(@RequestParam(name = "taskId") String taskId,
                                                    @RequestParam(name = "callTime") LocalDateTime callTime) {}

一开始我传递localdatetime是使用@RequestParam注解的,使用这个注解就相当于通过Feign调用服务的时候,将所需传递的参数拼接到URL后,一般传递字符类型的参数是没有问题,但是在传递localdatetime类型的参数时,未序列化造成了精度丢失。
当使用原来代码通过A服务使用Feign请求B服务时,请求的报文如下:

2021-07-14 16:21:43 INFO core.base.config.FeignLogger.log(46) 
	Client#getRemarkByTaskId(String,LocalDateTime):
	---> POST http://B/b/getRamrkByTaskId?taskId=t_abc&callTime=21-7-13+%E4%B8%8B%E5%8D%885%3A53 HTTP/1.1
	---> END HTTP (0-byte body)

通过报文可知taskId和callTime都拼接到了url中传递过去,我们将url:http:/B/b/remark/getRamrkByTaskId?taskId=t_abc&callTime=21-7-13+%E4%B8%8B%E5%8D%885%3A53 拿到网上在线URL网站解析,得到如下的结果:
在这里插入图片描述

解析出来的callTime缺少了秒,正是由于缺少了秒的单位,导致了后续sql查询中出现查询不到的异常。显然localdatetime通过url带参传递会存在问题,我这边解决的方法是直接将locadatetime类型参数通过body进行传输。对代码进行如下更改
请求侧A服务修改后的代码:


    @RequestMapping(path = "/getRamrkByTaskId/{taskId}", method = RequestMethod.POST)
    public Result<List<RemarkRecords>> getRemarkByTaskId(@PathVariable(name = "taskId") String taskId,
                                                         @RequestBody LocalDateTime callTime);

被调用侧B服务修改后的代码:

  @RequestMapping(value = "/getRamrkByTaskId/{taskId}", method = RequestMethod.POST)
    public Result<List<RemarkRecords>> getRamrkByTaskId(@PathVariable(name = "taskId") String taskId,
	@RequestBody LocalDateTime callTime) {}

直接简单粗暴一点,将参数callTime通过body传输,这样子就不会存在时间精度丢失的问题了。再来看下修改后的请求报文是什么样子的,如下:

2021-07-14 16:47:06 INFO .f.c.core.base.config.FeignLogger.log(46) 
	Client#getRemarkByTaskId(String,LocalDateTime):
	---> POST http://B/bgetRamrkByTaskId/t_abc HTTP/1.1
	Content-Type: [application/json;charset=UTF-8]
	Content-Length: [20]
	requestBody: [2021,7,13,17,53,54]
	---> END HTTP (20-byte body)

修改请求的报文已将将localdatetime存requestBody中,requestBody: [2021,7,13,17,53,54],请求的时间格式是2021/7/12 17:53:54。之前参数丢失的秒通过body传输后正常了,问题解决。

总结

url带参传输方式,可能存在参数格式错误的情况。如对象传输需要先序列化,本次传输localdatetime也存在了该问题。在今后不止是使用Feign传输参数时,也多关注传输前后参数是否被转换出错的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值