SAP UI5 OData更新报Inline component is not defined错误如何解决
SAP OData实体更新400报错排查
问题描述
排查该问题已有较长时间,始终未找到报错原因:同项目的另一个控制器中使用完全相同的代码可以正常更新模型,但是当前控制器执行更新时报错。已检查batch请求,待提交的变更内容没有问题,batch请求本身看起来正常,暂无法定位报错点。
相关代码
onAcepta: function(oEvent) { var oModel = this.getOwnerComponent().getModel(); var oDataModel = this.getOwnerComponent().mainIdentJson; console.log(oDataModel); var sPath = "/IdentitiesSet(Userid='" + oDataModel.Userid + "',Ident='" + oDataModel.Ident + "')"; oModel.update(sPath, oDataModel, { success: function(oData, oResponse){ console.log("OK"); }, error: function(oResponse){ console.log("No"); } }); this.closeParent(); this.selectedItems = []; }
报错信息
2021-08-13 14:01:40.161899 Request failed with status code 400: MERGE IdentitiesSet(Userid='?????????'.Ident='?') - [{"code":"SY/530","message":"Inline component is not defined or not allowed (HTTP PUT)","persistent":false,"targets":["/IdentitiesSet(Userid='?????????'.Ident='?')"],"type":"Error"}] sap.ui.model.odata.ODataMessageParser
故障原因及解决方案
- 请求路径拼接异常:报错信息中显示的实体路径两个主键参数之间的分隔符为英文句号,而OData规范要求使用英文逗号分隔。请先在sPath拼接完成后添加
console.log(sPath)打印实际生成的路径,确认是否存在拼写笔误、或者oDataModel.Userid/oDataModel.Ident的取值末尾带特殊字符导致逗号被替换的问题。 - 主键参数取值异常:报错中显示的Userid和Ident取值为乱码问号,说明
this.getOwnerComponent().mainIdentJson中的两个主键字段要么未正确赋值,要么取值包含非UTF-8编码的特殊字符没有转码。请和正常运行的控制器做对比,确认当前场景下mainIdentJson的赋值时机、赋值内容是否和正常场景一致。 - OData模型配置差异:确认当前控制器获取的oModel实例和正常运行的控制器使用的是否为同一个实例,是否当前模型被额外设置了
defaultUpdateMethod为PUT而不是默认的MERGE,部分后端OData服务仅支持MERGE方式更新实体,不允许直接PUT覆盖全量实体。 - 全局拦截器影响:排查项目中是否存在全局的OData请求拦截逻辑,针对特定路径或者特定场景会修改请求路径、请求头或者payload参数,导致最终发出的请求不符合后端要求。
- Payload字段合法性校验:对比当前请求和正常请求的提交payload,确认当前payload中是否包含了后端定义的只读字段,或者字段格式、字段类型不符合后端校验规则。
内容的提问来源于stack exchange,提问作者JK97Tae
相关产品推荐
相关产品推荐

