zoukankan      html  css  js  c++  java
  • 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种,因为咱也不知道为啥要用单例模式,咱也不敢改...

  • 相关阅读:
    团队项目-选题报告
    第一次结对编程作业
    第一次个人编程作业
    第一次软工作业
    antd form表单数组对象格式
    antd form表单验证失去焦点时验证和重置验证状态
    fetch请求
    typescript类装饰器
    typescript泛型
    浮点数问题
  • 原文地址:https://www.cnblogs.com/yibing-jia/p/14668176.html
Copyright © 2011-2022 走看看