Salesforce REST API基于Wrapper创建Order类报方法签名错误
报错根因
报错本质是语法使用错误:你代码中的productMAp、PricebookEntryMAp是提前存储查询结果的Map类型变量,不是自定义方法。Apex中Map集合取值需要调用.get(键名)方法,你直接写productMAp(xxx)的写法会被编译器识别为调用名为productMAp、入参为String的方法,类中找不到对应方法就会抛出该签名错误。
代码现存其他问题
- 拼写不规范:存在大量变量名拼写错误,比如
oderWrap应为orderWrap、productMAp/PricebookEntryMAp大小写混乱、createOrderLineItimes应为createOrderLineItems,极易引发变量识别错误 - 订单项赋值逻辑错误:插入Order后给订单项写
poLine.orderid =poLine.order.Id的逻辑无效,未持久化的订单项实例上的order关联对象为空,会触发空指针 - 空指针风险:未判断
PricebookList查询结果、contractMap取值是否为空,直接取属性会在数据缺失时直接抛错 - 容错缺失:遍历订单项时未判断Map中是否存在匹配的Product2、PricebookEntry,传入空值会导致后续DML失败
修正后代码
首先确保你提前完成了Map数据初始化(原逻辑中缺失的初始化参考如下):
// 初始化标准价格簿 List<Pricebook2> pricebookList = [SELECT Id FROM Pricebook2 WHERE IsStandard = true LIMIT 1]; if(pricebookList.isEmpty()){ // 补充价格簿不存在的异常处理逻辑 return; } // 提取所有订单项的产品编码,批量查询Product2 Set<String> lineItemCodes = new Set<String>(); for(OrderWrapper.OrderLineItems item : orderWrap.OrderLineItems){ lineItemCodes.add(item.LineItemCode); } Map<String, Product2> productMap = new Map<String, Product2>(); for(Product2 pro : [SELECT Id, ProductCode FROM Product2 WHERE ProductCode IN :lineItemCodes]){ productMap.put(pro.ProductCode, pro); } // 批量查询对应价格簿的PricebookEntry Map<Id, PricebookEntry> pricebookEntryMap = new Map<Id, PricebookEntry>(); for(PricebookEntry pbe : [SELECT Id, Product2Id FROM PricebookEntry WHERE Pricebook2Id = :pricebookList[0].Id AND Product2Id IN :productMap.values()]){ pricebookEntryMap.put(pbe.Product2Id, pbe); }
订单创建核心逻辑修正如下:
// 先判断关联合同是否存在 Contract relatedContract = contractMap.get(orderWrap.AccountId); if(relatedContract == null){ // 补充合同不存在的异常处理逻辑 return; } Order ord = new Order( AccountId = orderWrap.AccountId, EffectiveDate = Date.today(), // 替换为实际传入的生效日期参数 Status = orderWrap.Status, PriceBook2Id = pricebookList[0].Id, ContractId = relatedContract.Id, ShippingStreet = relatedContract.Account.ShippingStreet, ShippingCity = relatedContract.Account.ShippingCity, ShippingPostalCode = relatedContract.Account.ShippingPostalCode, ShippingCountry = relatedContract.Account.ShippingCountry, ShippingState = relatedContract.Account.ShippingState ); List<OrderItem> orderItemList = new List<OrderItem>(); for(OrderWrapper.OrderLineItems orderLineItem : orderWrap.OrderLineItems){ // 修正Map调用方式,加非空判断 if(!productMap.containsKey(orderLineItem.LineItemCode)) continue; Product2 pro = productMap.get(orderLineItem.LineItemCode); if(!pricebookEntryMap.containsKey(pro.Id)) continue; PricebookEntry pbe = pricebookEntryMap.get(pro.Id); orderItemList.add(createOrderLineItems(ord, Integer.valueOf(orderLineItem.Quantity), pro, pbe)); } if(ord != null && !orderItemList.isEmpty()){ insert ord; // 修正订单项订单Id赋值逻辑,直接取刚插入的订单Id for(OrderItem poLine : orderItemList) { poLine.OrderId = ord.Id; } insert orderItemList; }
内容的提问来源于stack exchange,提问作者Prins
相关产品推荐
相关产品推荐

