一、错误日志

feign.codec.DecodeException: Error while extracting response for type [***] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `***` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `***` out of START_ARRAY token at [Source: (PushbackInputStream); line: 1, column: 1]

二、错误原因排查

1、服务端开启了gzip,而客户端未开启;

2、参数未进行json序列化;

3、jackson反序列化失败引起:实体bean对应不正确,或者时间格式化错误;

发现这个错误的时候,也是度娘一顿搜索,逐个排查,但是都一一排除了;因为这个错误不是说一致存在,而是偶尔引起的,这就很烦人,因为我用postman测试服务端接口,怎么测试都是好使的。

并且服务也都开启了gzip,客户端使用的是httpclient,服务端是okhttp;后来搜到可能是因为httpclient源码问题导致解析gzip失败,所以给客户端换为okhttp(默认支持),但是还是会出现同样错误。

PS:现在才想起来不是所有都有这个问题,只是偶尔该接口才会报这个;所以我找到生产数据进行postman测试,发现仍然ok;然后彻底方了!然后我就查看controller中所有接口,虽然都遵循了restful接口规范,但是该接口(获取单个实体Bean,Get)与获取所有实体Bean(List,Get)请求路径一样,只是本接口中使用了@GetMapping的params来指定必传参数项!

脑子一抖,会不会是请求到了List的接口上,导致了客户端解析返回值错误!poastman测试,少勾选一个参数,然后我就重现了该错误。。。

从数据库中取到的真实数据,确实有一个字段的值是空的,但是怎么从客户端到服务端就给我少了一个参数,难道是Feign导致的!

随后,度娘加打断点发现Feign真的会把null值给过滤掉!

这是Feign源码:

   @Overridepublic RequestTemplate create(Object[] argv) {RequestTemplate mutable = RequestTemplate.from(metadata.template());if (metadata.urlIndex() != null) {int urlIndex = metadata.urlIndex();checkArgument(argv[urlIndex] != null, "URI parameter %s was null", urlIndex);mutable.target(String.valueOf(argv[urlIndex]));}Map<String, Object> varBuilder = new LinkedHashMap<String, Object>();for (Entry<Integer, Collection<String>> entry : metadata.indexToName().entrySet()) {int i = entry.getKey();Object value = argv[entry.getKey()];if (value != null) { // Null values are skipped.if (indexToExpander.containsKey(i)) {value = expandElements(indexToExpander.get(i), value);}for (String name : entry.getValue()) {varBuilder.put(name, value);}}}RequestTemplate template = resolve(argv, mutable, varBuilder);if (metadata.queryMapIndex() != null) {// add query map parameters after initial resolve so that they take// precedence over any predefined valuesObject value = argv[metadata.queryMapIndex()];Map<String, Object> queryMap = toQueryMap(value);template = addQueryMapQueryParameters(queryMap, template);}if (metadata.headerMapIndex() != null) {template =addHeaderMapHeaders((Map<String, Object>) argv[metadata.headerMapIndex()], template);}return template;}

可以看到注释会把null值跳过!

Feign源码问题导致请求参数丢失相关推荐

  1. Spring源码解析 -- SpringWeb请求参数获取解析

    Spring源码解析 – SpringWeb请求参数获取解析 简介 在文章:Spring Web 请求初探中,我们看到最后方法反射调用的相关代码,本篇文章就探索其中的参数是如何从请求中获取的 概览 方 ...

  2. feign源码解析 - 运行时

    基于spring-cloud-openfeign-core-2.2.5.RELEASE. 0. 目录 1. 前言 2. 入口`ReflectiveFeign.FeignInvocationHandle ...

  3. Feign源码分析(without spring)

    https://spring-cloud-wiki.readthedocs.io/zh_CN/latest/pages/feign.html 简介 Feign是一个声明式的Web Service客户端 ...

  4. Squid 代理服务器 编译源码 伪造HTTP_X_FORWARDED_FOR 请求头

    本实验操作系统选用 CentOS release 5.6 (Final) 实验目的实现 Squid 代理服务器 编译源码 伪造HTTP_X_FORWARDED_FOR  请求头 .使其显示任意IP 过 ...

  5. Spring Cloud Alibaba源码 - 22 Feign 源码解析

    文章目录 Feign 源码 核心思想 --- 动态代理 Feign 源码 核心思想 - 动态代理 呶 ,图又又又给你画好了, https://www.processon.com/view/link/6 ...

  6. Spring源码解析 -- SpringWeb请求映射Map初始化

    简介 在上篇文章中,大致解析了Spring如何将请求路径与处理方法进行映射,但映射相关的初始化对于我们来说还是一团迷雾 本篇文章就来探索下,请求路径和处理方法的映射,是如何进行初始化的 概览 基于上篇 ...

  7. Spring 源码解析 -- SpringWeb请求映射解析

    Spring 源码解析 – SpringWeb请求映射解析 简介 基于上篇请求路径初步探索,了解到了一个请求到具体处理方法的大致路径,本篇就继续探索,看下路径是如何匹配到处理方法的 概览 基于上篇:S ...

  8. 比心app源码,携带对象参数跳转页面

    比心app源码,携带对象参数跳转页面实现的相关代码 1.携带对象 json转字符串后进行编码<span slot="action" slot-scope="reco ...

  9. SpringCloud Feign 源码底层如何调用Ribbon实现服务调用的负载均衡

    在SpringCloud微服务中调用都不是直接用Ribbon进行服务调用,因为那样的化项目中的代码量会增加很多,微服务之间的调用是用Feign来进行调用,下面就是普通的一个接口调用例子 这样就可以进行 ...

最新文章

  1. 考研国家线罕见大幅上涨,12个学科涨幅10分以上,超300万人将落榜
  2. Incorrect string value: '\xF0\x90\x8D\x83...' for column 通用解决方案
  3. zip解压mysql安装图解_Mysql安装教程-zip格式压缩包
  4. Quibi:我轻轻地咬一口 你最爱的Netflix和TikTok
  5. redis streams_初步了解Redis Streams以及如何在Java中使用它们
  6. ArcGIS10.6 通过ArcMap发布二维数据服务。
  7. 思考题1(雇员、部门、领导)
  8. nginx反向代理解决跨域问题,使本地调试更方便
  9. 14.使用 CSS 显示 XML
  10. 【转载】ARX程序再VS2002中的调试初探
  11. 计算机图形学的未来前景,计算机图形学的发展前景
  12. 做数据迁移差点累死的程序员有话要说----数据迁移经验分享
  13. 产品研发中存在的问题和缺陷
  14. 纯文本、富文本、超文本
  15. SQL数据库权限禁止授予deny
  16. python 因子分析_因子分析在python上的实现
  17. 统计学python是什么方向的_python--统计学理论基础
  18. 关于安卓自定义进度条(二)
  19. c4droid编译java_Windows下的java控制台已经完成,Linux相信很简单了
  20. task6 .OR、IF以及whilemd

热门文章

  1. Python实现遗传算法库
  2. 标准差(S 或SD),标准误
  3. html+css+javascript弹跳球小游戏
  4. e2fsck -y 故障_【计算机论文】非线性编辑系统构建及其故障维护
  5. BEVDet:High-Performance Multi-Camera3D Object Detection in Bird-Eye-View
  6. 围捕神经猫android版[开源]
  7. 个人笔记之面向对象--从游戏小DEMO方向了解继承
  8. 吊舱追踪 | 车机协同作战小实验
  9. 看地图人,如何零代码发布莆田系医院在线地图
  10. stata 画图碎片