SAPUI5调用OData创建CDS View新条目报实体格式不支持错误
错误原因及修复方案
- 字段名拼写错误
代码中给提交数据赋值时,将实体字段Ktonr误写为Kotnr,和OData服务定义的实体字段不匹配,属于非法字段,会导致服务端解析实体失败。 - 请求头配置错误
手动设置的Content-Type头application/json;type=entry;charset=utf-8不符合SAP OData V2服务的要求,标准场景下无需手动修改ODataModel的Content-Type,框架会自动生成符合规范的请求头,额外添加的type=entry参数会导致服务端无法识别请求格式。 - create方法参数传参错误
SAPUI5 ODataModel的create方法标准参数为(sPath, oData, mParameters),你多传入了一个null作为第三个参数,导致后续定义的success、error回调配置没有被框架正确识别,请求参数格式也会出现异常。 - 执行逻辑顺序错误
关闭弹窗、刷新表格、成功提示的逻辑直接写在create方法调用之后,属于同步执行,会出现创建请求还未得到服务端响应就已经刷新表格、提示保存成功的问题,应该将这部分逻辑移到success回调中。 - 主键字段未赋值
从你注释的代码看,Belnr、Kukey、Esnum大概率是该实体的主键字段,OData创建请求必须传入主键字段的合法值,如果这三个字段的值是由服务端自动生成的,需要确认OData服务的实体定义中是否将这三个字段标记为Computed/Identity,否则服务端会因为缺少主键字段拒绝请求。
修正后的代码
onSaveDialog : function () { var oModel = this.getModel(), data = {}; data.Bukrs = this.getView().getModel("InputData").getProperty("/Bukrs"); // 修正字段名拼写错误 data.Ktonr = this.getView().getModel("InputData").getProperty("/Ktonr"); data.Azdat = this.getView().getModel("InputData").getProperty("/Azdat"); // 若主键不由服务端自动生成,请取消注释并赋值 // data.Belnr = "111"; // data.Kukey = "222"; // data.Esnum = "333"; data.Kwaer = this.getView().getModel("InputData").getProperty("/Kwaer"); data.Kwbtr = this.getView().getModel("InputData").getProperty("/Kwbtr"); data.Texts = this.getView().getModel("InputData").getProperty("/Texts"); data.Lqpos = this.getView().getModel("InputData").getProperty("/Lqpos"); data.Zregcl = this.getView().getModel("InputData").getProperty("/Zregcl"); data.Zregfe = this.getView().getModel("InputData").getProperty("/Zregfe"); data.Zregus = this.getView().getModel("InputData").getProperty("/Zregus"); var that = this; oModel.create( "/ZI_BSLiquidityGroups", data, { success : function(oData, response) { console.log("Create successfull"); that.byId("AddDialog").close(); that.getView().byId("detailRecordsSmartTable").rebindTable(true); // 触发事件更新主视图 var oEventBus = that.getOwnerComponent().getEventBus(); oEventBus.publish("DetailTable", "Updated", that); var msg = that.getView().getModel("i18n").getResourceBundle().getText("detail.newRecordSaved"); MessageToast.show(msg); }, error : function(oError) { console.log(oError.responseText) var msg = oError.responseText.split('message')[3]; MessageToast.show(msg); } } ); },
内容的提问来源于stack exchange,提问作者Tincho
相关产品推荐
相关产品推荐

