SAPUI5 调用有association的UPDATE_ENTITY方法,抛出/IWFND/CL_SODATA_ENTRY_PROV
问题描述:
通过下面的SAPUI5代码,想调用后端gateway的UPDATE_ENTITY方法,在UPDATE_ENTITY里打了外部断点,但是执行后,代码没有执行到断点位置,就抛出/iwfnd/cx_mgw_tech_exception了。
sPath = aSelectedProducts[i].getBindingContext().getPath();
oProductObject = aSelectedProducts[i].getBindingContext().getObject();
oProductObject.UnitsInStock += 10;
this.getModel().update(sPath, oProductObject, {
success : this._handleReorderActionResult.bind(this, oProductObject.ProductID, true, i+1, aSelectedProducts.length),
error : this._handleReorderActionResult.bind(this, oProductObject.ProductID, false, i+1, aSelectedProducts.length)
});
原因调查:
使用Trcd:/o/IWFND/ERROR_LOG查看log,log截图如下。
起初使用【Inline component is not defined or not allowed】错误信息,去搜索,没有结果。
在图片里发现了Exceptions的信息,而且有class的名字/IWFND/CL_SODATA_ENTRY_PROV。
使用se24,输入/IWFND/CL_SODATA_ENTRY_PROV,继续调查标准代码,发现进入了IF分支也就是执行到了62行,
进入到deserialize_inline_data方法后,在执行下图的27行代码后,
发现:lv_navi_name的值是SUPPLIER,但是构造ES_DATA里面并没有SUPPLIER字段,所以27行的执行后,sy-subrc是4,就执行到了32行,也就抛出了/iwfnd/cx_mgw_tech_exception,最终导致了Log里面的结果。
问题分析:
由于构造里没有SUPPLIER字段,导致了错误。
gateway后台有2个Entity Set,它们之间有association,SUPPLIER就是association的名字。
变量oProductObject里面确实有SUPPLIER属性。不知道如何解决。
oProductObject = aSelectedProducts[i].getBindingContext().getObject();
暂定对策:
把变量oProductObject的SUPPLIER属性删除掉。
通过delete oProductObject.Supplier;
然后执行发现,不进入if,就能够正常进入自己定义的UPDATE_ENTITY方法了。