SAP Java SDK OData伙伴函数查询结果重复翻倍问题求助
SAP BTP Java应用读取BP伙伴函数结果重复翻倍问题排查
问题根源分析
从代码逻辑和现象来看,核心问题出在类成员变量的状态未重置:
custSalesPartnerFunctions是类级别的成员变量,每次调用getPartnerFunctions时都会执行addAll追加数据,但从未在处理前清空。这导致每次接口调用都会累加之前的结果,出现6→12→24的翻倍现象。- 1-2小时后结果恢复正常,是因为SAP BTP的应用实例被平台自动回收重启,新实例的成员变量重新初始化为空,首次调用自然返回正确的6条数据。
你怀疑的缓存机制并非问题原因——如果是SDK缓存导致,其他数据(如地址)也会出现重复,而目前只有伙伴函数异常,说明问题在自身代码逻辑。
修复方案
方案1:每次处理前清空成员变量
在加载数据前,先清空存储销售区域和伙伴函数的成员变量,避免数据累加:
private void getBusinessPartnerCustomerSalesAreas() { Customer customer = this.businessPartner.getCustomerOrFetch(); if (customer == null) { return; } // 清空历史销售区域数据 this.businessPartnerCustomerSalesArea.clear(); this.businessPartnerCustomerSalesArea.addAll(customer.getCustomerSalesAreaOrFetch()); // 清空历史伙伴函数数据 this.custSalesPartnerFunctions.clear(); this.getPartnerFunctions(); } private void getPartnerFunctions() { this.businessPartnerCustomerSalesArea.forEach(c -> { this.custSalesPartnerFunctions.addAll(c.getPartnerFunctionOrFetch()); }); }
方案2:改用局部变量避免状态污染
将存储伙伴函数的变量改为方法局部变量,彻底避免类成员变量的状态残留:
private void getBusinessPartnerCustomerSalesAreas() { Customer customer = this.businessPartner.getCustomerOrFetch(); if (customer == null) { return; } List<CustomerSalesArea> salesAreas = customer.getCustomerSalesAreaOrFetch(); // 直接传递销售区域列表到方法,使用局部变量存储伙伴函数 List<CustSalesPartnerFunction> partnerFunctions = getPartnerFunctions(salesAreas); // 后续映射逻辑直接使用局部变量 if (!partnerFunctions.isEmpty()) { List<CustfactsheetPartnerFunction> outputList = new ArrayList<>(); partnerFunctions.forEach(p -> { CustfactsheetPartnerFunction item = CustfactsheetPartnerFunction.create(); item.setFunction(p.getPartnerFunction()); item.setCustomer(p.getCustomer()); item.setCustomerName(p.getCustomerPartnerDescription()); item.setIsDefault(p.getDefaultPartner()); outputList.add(item); }); returnStruc.setPartnerFunctions(outputList); } } private List<CustSalesPartnerFunction> getPartnerFunctions(List<CustomerSalesArea> salesAreas) { List<CustSalesPartnerFunction> partnerFunctions = new ArrayList<>(); salesAreas.forEach(c -> { partnerFunctions.addAll(c.getPartnerFunctionOrFetch()); }); return partnerFunctions; }
验证建议
修复后可以多次调用接口,检查伙伴函数数量是否保持稳定;同时观察1-2小时后的数据是否依然正常,确认问题解决。
内容的提问来源于stack exchange,提问作者Tobias
相关产品推荐
相关产品推荐

