Feign源码问题导致请求参数丢失
一、错误日志
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源码问题导致请求参数丢失相关推荐
- Spring源码解析 -- SpringWeb请求参数获取解析
Spring源码解析 – SpringWeb请求参数获取解析 简介 在文章:Spring Web 请求初探中,我们看到最后方法反射调用的相关代码,本篇文章就探索其中的参数是如何从请求中获取的 概览 方 ...
- feign源码解析 - 运行时
基于spring-cloud-openfeign-core-2.2.5.RELEASE. 0. 目录 1. 前言 2. 入口`ReflectiveFeign.FeignInvocationHandle ...
- Feign源码分析(without spring)
https://spring-cloud-wiki.readthedocs.io/zh_CN/latest/pages/feign.html 简介 Feign是一个声明式的Web Service客户端 ...
- Squid 代理服务器 编译源码 伪造HTTP_X_FORWARDED_FOR 请求头
本实验操作系统选用 CentOS release 5.6 (Final) 实验目的实现 Squid 代理服务器 编译源码 伪造HTTP_X_FORWARDED_FOR 请求头 .使其显示任意IP 过 ...
- Spring Cloud Alibaba源码 - 22 Feign 源码解析
文章目录 Feign 源码 核心思想 --- 动态代理 Feign 源码 核心思想 - 动态代理 呶 ,图又又又给你画好了, https://www.processon.com/view/link/6 ...
- Spring源码解析 -- SpringWeb请求映射Map初始化
简介 在上篇文章中,大致解析了Spring如何将请求路径与处理方法进行映射,但映射相关的初始化对于我们来说还是一团迷雾 本篇文章就来探索下,请求路径和处理方法的映射,是如何进行初始化的 概览 基于上篇 ...
- Spring 源码解析 -- SpringWeb请求映射解析
Spring 源码解析 – SpringWeb请求映射解析 简介 基于上篇请求路径初步探索,了解到了一个请求到具体处理方法的大致路径,本篇就继续探索,看下路径是如何匹配到处理方法的 概览 基于上篇:S ...
- 比心app源码,携带对象参数跳转页面
比心app源码,携带对象参数跳转页面实现的相关代码 1.携带对象 json转字符串后进行编码<span slot="action" slot-scope="reco ...
- SpringCloud Feign 源码底层如何调用Ribbon实现服务调用的负载均衡
在SpringCloud微服务中调用都不是直接用Ribbon进行服务调用,因为那样的化项目中的代码量会增加很多,微服务之间的调用是用Feign来进行调用,下面就是普通的一个接口调用例子 这样就可以进行 ...
最新文章
- 考研国家线罕见大幅上涨,12个学科涨幅10分以上,超300万人将落榜
- Incorrect string value: '\xF0\x90\x8D\x83...' for column 通用解决方案
- zip解压mysql安装图解_Mysql安装教程-zip格式压缩包
- Quibi:我轻轻地咬一口 你最爱的Netflix和TikTok
- redis streams_初步了解Redis Streams以及如何在Java中使用它们
- ArcGIS10.6 通过ArcMap发布二维数据服务。
- 思考题1(雇员、部门、领导)
- nginx反向代理解决跨域问题,使本地调试更方便
- 14.使用 CSS 显示 XML
- 【转载】ARX程序再VS2002中的调试初探
- 计算机图形学的未来前景,计算机图形学的发展前景
- 做数据迁移差点累死的程序员有话要说----数据迁移经验分享
- 产品研发中存在的问题和缺陷
- 纯文本、富文本、超文本
- SQL数据库权限禁止授予deny
- python 因子分析_因子分析在python上的实现
- 统计学python是什么方向的_python--统计学理论基础
- 关于安卓自定义进度条(二)
- c4droid编译java_Windows下的java控制台已经完成,Linux相信很简单了
- task6 .OR、IF以及whilemd
热门文章
- Python实现遗传算法库
- 标准差(S 或SD),标准误
- html+css+javascript弹跳球小游戏
- e2fsck -y 故障_【计算机论文】非线性编辑系统构建及其故障维护
- BEVDet:High-Performance Multi-Camera3D Object Detection in Bird-Eye-View
- 围捕神经猫android版[开源]
- 个人笔记之面向对象--从游戏小DEMO方向了解继承
- 吊舱追踪 | 车机协同作战小实验
- 看地图人,如何零代码发布莆田系医院在线地图
- stata 画图碎片