@RequestParam 参数偶尔丢失

改动过一版代码之后, 发现@RequestParam注解的参数经常丢失.

  1. 首先确认前端确实把参数传过来了,
  2. 用curl直接请求接口, 发现有时候会出现参数丢失, 重启后再用curl请求某个丢失参数的接口, 无论怎么重试都不会有问题.

没办法了, 只好去跟tomcat的源码, 因为@RequestParam的参数会从request.getParameterMap()方法里取对应的值, 然后打个断点看tomcat怎么获取的
在这里插入图片描述
最终跟到这个类里, 实现方法
在这里插入图片描述
最终走到coyoteRequest的getParameters方法, 实现很简单
在这里插入图片描述
然后getParameterNames();
在这里插入图片描述
最终处理查询参数
在这里插入图片描述
最终就是从queryMB这个参数解析出来, 这个queryMB就是请求时传过来的参数,
那就看看当getParameterMap为空的时候, queryMB是否为空, 来判定tomcat一定是接到了参数
在这里插入图片描述
然后发现queryMB有值, 但是似乎好像上面的方法没有把这个参数解析出来, 开始怀疑一定是某个接口改了什么东西, 因为Request是可以被循环利用的, 但是这个request被再次使用一定是请求结束了, 后来怀疑是使用了deferedResult, 但也被排除了, 因为deferedResult会使用servlet3.0以上的异步方式, request不会被提前循环使用, 百思不得其解的时候同时搜到了一篇文章
https://blog.csdn.net/Mr_SeaTurtle_/article/details/79274748 (手动给作者点赞)
豁然开朗,(后来发现有一个导入功能比较耗时, 被放在了一个纯异步的方法里, 访问的方法里有一个方法被切面切掉了, 并且里面获取了request.getParameter)
request可以传递到异步线程, 但要保证在请求返回之前访问, 如deferedResult set值之前. (为了避免这种情况,还是尽量不要传到异步线程里了).

发布了44 篇原创文章 · 获赞 13 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_19457117/article/details/99125623