ABAP开发奇葩BUG记录: BAPI为何会清空Class的实例属性

今天又又又遇见一个神奇的问题。

顾问报过来一个BUG,说某个类方法里,调用bapi之后,类的某个实例属性被清空掉了,导致后续用到该属性的逻辑出了问题。

刚看到的时候我脑子里全是问号,并且有点想笑,怎么可能?

什么bapi这么nb,还能清空掉我的实例属性,先声明下,这个bapi并没有用到该属性,该属性也从未给到过引用。

抽空debug跟了一下代码,原来真的是我太年轻,bug见的不够多。

先说结论:调用某个class的实例方法中,调用了一个BAPI之后,class的 Instance Attribute 确实被清空掉了。

我当时脸色就变了,隐隐想到了一种可能,顺着这思路debug了下去...

果然...

事情是这样的:

这个BAPI里,有个BADI增强,该增强重新调用了该实例类去实现某些业务逻辑。

到这里都没问题,问题是调用这个类的时候,去实例缓存里读取了该类的实例,如果有,那么就用已有的实例,而不是新建一个。

也就是说,用了另一种方式搞了单例模式。

获取到当前实例之后,在某个方法里清空了某实例属性并重新赋值,逻辑赋值为空...

然后执行完了这部分业务逻辑,bapi返回到原来的class之后,由于都是同一个实例,所以该实例属性自然就是被清空掉的那个...

于是接下来的逻辑出了问题。

Debug完之后,秉秉气的半天说不出话。

解决方法也简单,有两种

1:干掉单例模式逻辑,因为执行的是两段业务,不应该用同一个实例

2:调用bapi前搞个本地变量存一下,之后的逻辑就用这个本地变量

 

最终选了第2种,因为咱也不知道为啥要用单例模式,咱也不敢改...

posted @ 2021-04-16 17:55  以秉  阅读(251)  评论(0编辑  收藏  举报