2019独角兽企业重金招聘Python工程师标准>>>
症状:
代码还是按照常规写法写的,莫名其妙的忽然使用request拿不到参数。
如上面的代码,springmvc帮我们自动做的映射数据拿不到数据,使用request.getParameter("dpId") 也拿不到数据。 @RequestParam 等等方式都试过就是拿不到。
再说页面,这个bug还神奇的在这里,先说业务,我们这个系统会先进入一个页面,这个页面是一个数据下发状态的显示,这时候用户会有一个操作,点击页面的下发数据操作,这时候后台会启动一个线程执行下发数据操作(这个操作是很耗时的),线程启动后返回,前端判断已经启动成功,就会再次刷新这个页面。这个时候,就会出现上面这个错误,拿不到前端参数,如果切换到其他的页面,还是可以正常获取参数。
定位过程:最开始是怀疑请求的方式有问题,换了get post ,参数都有就是拿不到,然后怀疑是请求的类型有问题,
这些换了还是存在这个问题,然后配置打开tomcat的容器日志,
可以看到参数是被tomcat拿到了的,基本可以排除是前端的问题了,那后端就可能是拦截器这里搞的鬼,再次检查全部的拦截器,这时候发现
request.getQueryString();
可以拿到参数,request.getParmeter 还是拿不到参数,然后各种bug排查,最终还是没定位到。最后,异想天开的将
如上代码,启动线程这一块注释掉,可以获取到参数了,问题终于定位到是多线程这里的问题。
那到底是哪里的问题呢?
线程中的各种异常都处理了,唯一有点不一样的是,request是传入的,这个类我并不太了解,会不会是这里的问题,将request中的数据拿出来后,单独传入必要的参数后,问题解决了,基本可以确定是request传入到多线程中导致的问题了,而且也可以解释因为为什么第二次请求会有问题,切换页面请求又没有问题了,很大可能就是request是同一个request导致的。