You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:17:40