一个如此简单的引用问题,竟让我排查了半天

⭐⭐⭐⭐⭐转载请注明出处:https://juejin.cn/post/7404007685644435483

前几天,测试让我看一个问题,是一个套包及子产品的查询接口返回的子产品数量不对。

先简单解释一下套包的概念吧。套包就是将若干个产品一起打包售卖,每个套包里会标定各个子产品的数量。就和肯德基的套餐差不多是一个意思。

我们这边有好几套测试环境,测试人员是在demo环境发现了这个问题。为了严谨起见,我先去test环境自己先试了一下,发现子产品的数量可以正常返回。我以为是测试改了套包的产品数量,然后没清购物车,是缓存导致的问题,但是测试人员给我在demo环境演示了一遍,将数量改了,但是返回的始终是1。我想会不会是数据库里存的就是1,所以我又去查了一下数据库,数据库里是3,返回到前端的却变成了1。我又对比了一下代码,test环境和demo环境代码是一样的,为什么test环境可以返回正确的数量,到了demo就不行了,奇了怪了。

由于这个接口的代码之前不是我写的,所以我又去仔细研究了一下代码逻辑。

代码逻辑是先查询套包信息,再从套包与子产品关联表里查了套包关联了哪些子产品以及子产品的数量,因为关联表里只存了产品的id以及数量信息,产品的名称这些信息没有存。所以又通过上一步获取到的子产品id集合去查了产品表,为了减少查询次数,这一步是将多个套包里的子产品id放在一起去查询的,然后通过产品id分组成一个Map。最后遍历一下,从Map中获取到产品,然后拼上数量信息,挂到套包下,返回到前端。其实这一步是有问题的,但此时我还没有意识到问题所在。

为了能更好的排查问题,我再循环填充套包产品信息的时候打了一下日志,并在最终返回的地方也打了日志。但是日志打出来的信息很奇怪,遍历的时候,产品数量是正确的,但是最后返回时打印的数量就不对了。我自己在页面上点击的时候,发现通过条件筛选出只有一个套包的时候,数量是正确的,不通过条件筛选,返回多个套包及子产品时,子产品数量就不对了。我再点开每个套包查看一下里面的产品,发现有相同的产品,再回想起代码里的Map,我恍然大悟,知道了是怎么回事。

不知道小伙伴们看到这里的时候,知不知道原因是什么,如果还没明白,请继续往下看。

因为子产品的信息都放在了Map里,从Map里获取子产品挂到对应的套包上,然后给子产品的数量字段赋值。所以当不同的套包里包含相同的子产品时,获取到的是同一个子产品对象。当给第一个套包的A产品赋值数量时,ok没问题,但是当给第二个套包的A产品再次赋值数量时,由于操作的是同一个对象,所以连着第一个套包的A产品一起修改了,就会出现子产品数量不正确的情况。

就像下图一样,两个套餐中都有老北京鸡肉卷,但是指向的是同一个对象,所以在给套餐2的老北京鸡肉卷对象的数量字段赋值时,连带着套餐1中的老北京鸡肉卷对象的数量也改成了1。

知道了问题所在,解决起来就很简单了。我的做法是再给套包挂子产品时,将子产品的对象复制一份,然后赋值数量再挂到套包下。这样虽然都是老北京鸡肉卷,但是是两个不同的对象,各自的字段数据都是独立的,就不会出现上述情况了。

⭐⭐⭐⭐⭐转载请注明出处:https://juejin.cn/post/7404007685644435483

如果您觉得文章还不错,请给我来个点赞收藏关注

学习更多编程知识,微信扫描下方二维码关注公众号『 R o b o d 』:

code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值