本文中表情包来自发表情,如有侵权我表示歉意,请联系jian.zhangg@qq.com。封面来自画师朋友王首梁亲笔,再次以示感谢。
昨天项目测试发现个bug,列表查询查不出内容,写代码的同事表示本地自测正常,不知道发布到测试怎么回事。
我先表明,我们程序员不是说写完代码就叫任务完成,只有到项目线上正常运行才叫完成。 接着我让他尝试着解决这个问题。良久未解决,于是我来着手看看咋回事。
我先大致看了下流程,前台请求打到后端接口,接口里调用了mapper,封装数据后返回给前端。
根据经验和推理,这种情况下最有可能是SQL出问题,于是我试着运行了下SQL,但根据id查到了数据(其实还是这块的问题,我当时看疏忽了)。
这时有点黑人般的疑问了,不应该啊。剧情到这里应该结束的,导演临场加戏了。
接着我本地跑起来调了下接口,握草?ヾ(。`Д´。) 也没问题。
看来是个只有在测试才能复现的bug。
走了这么一大圈,又回来看测试日志。其实这里我的问题挺大的,出现问题第一步应该是看日志,再根据日志找代码,看业务逻辑。 怪我小看了这个bug。
在测试日志中看到SQL结尾拼接了and name like 'health-mall',这尼玛。。。掐指一算,感觉事情并不简单。
又回头看了眼SQL
好了,犯罪现场被逮到了。
两个问题
- like拼接不这么玩。一般用mysql的concat函数。例如:
and name like concat ('%',#{name},'%') - mybatis赋值用
#{}而不是${}
那为什么本地跑没问题,上测试就出问题了呢?我陷入1s深深的沉思得到了答案。
发布脚本是我写的,发布到测试先被maven打成jar包,再用java -jar 运行。maven中有这个配置
<resource>标签(官网文档)表示怎么处理资源文件,<filtering>为true的表示把${name}中的name替换为指定值。而我的yml中有这么一段。
${name}改成了health-mall,执行语句的时候总会带上and name like 'health-mall',自然毛线都查不出来。
至此,问题都解释并且解决。
我看了下时间刚好到九点半,真是充实又快乐的一天呀~
欢迎关注微信公众号,提供思想和技术类原创文章。微信搜索小兵张健或扫描以下二维码。