苍穹外卖@RequestBody导错包导致接收不到传入参数
目录
一、前言
二、调试找bug
三、总结
一、前言
这是我在Day9完成管理端接单业务代码时发现的错误,这也算是我一次独立找bug的体验。起因是我在完成接单业务代码之后,进行前后端联调测试,在前端页面点击接单按钮,前端会跳出操作成功的弹框,但是前端页面的订单状态没有改变还是待接单(数据库里面的status也没有改变)
本博客主要是这个常见但是很容易疏忽的问题,以及记录一下我是如何debug找到问题所在的。之前学习都是跟着老师debug调试,出现问题就看弹幕,这次自己debug的体验还是很独特
二、调试找bug
然后我就去控制台找debug语句,发现没有找到update的sql语句。然后我就开始打断点调试,第一个断点打在OrderController的接单方法的log语句上
第二个断点打在了OrderServiceImpl如下图的位置(这里由于我前面跳过微信支付修改代码加了一个全局变量orders,所以这里我就改成了ordersForConfirm,实际上这里也是我排查问题发现有两个orders所以修改一下以防出现影响)
重新启动服务打开前端页面调试,当点击接单按钮时,跳转到第一个断点,我发现传入的参数ordersConfirmDTO的id和status都为null。
然后我还是放行到第二个断点,一步步往下走,发现由于传入的id为null,所以在builder那里构建出来的ordersForConfirm的id也为null,status倒是成功修改了。
最后到update,这里点开orderMapper.xml查看动态sql可知由于id为null所以都不会发出update的sql语句
通过这样整个流程的排查可以锁定问题就是出现在一开始OrderController的方法的传入参数都为null。当时我第一想法就是是不是直接给的前端资源代码是有问题的,但是毕竟前端代码是直接给的而且我问做过的同学或者是查询发现别人接单的测试都是没有问题的。
然后我就开始有点懵了,没办法就用apifox进行接口测试看看。发现同样传入正确的json格式数据但是到第一个断点就是id为null,status为null。此时我问ai或者是问同学想了半天,知道问题就是出现在参数数据。最后回想起很早之前学习苍穹外卖的时候犯过一个错误就是@RequestBody导错包,自己把@RequestBody删除然后选择导包是springwork的就成功解决了(不要导成swagger那个)
三、总结
这次debug我的顺序是:前后端联调 -> 联调出现问题观察控制台输出 -> 打两个断点重新调试 -> 在断点调试中观察数据的变化 -> 使用apifox进行接口测试 -> 确认问题出现的源头在传入参数 -> 发现@RequestBody导错包导致参数无法成功传入