配置SAP Gateway服务以忽略未定义的有效负载中的属性

时间:2016-01-26 15:19:06

标签: sap sapui5

场景很简单:我有一个产品列表,在前端我在oData模型中动态创建了一个属性(“EditMode”)。我仅将此属性用于前端以启用/禁用某些输入字段。 当我执行更新(POST)网关请求faild(400-bad request)时,因为没有在Product实体上定义“EditMode”。

如何配置网关以忽略未定义的属性并仅从有效负载中获取所需的属性?

在发送请求之前从oData模型中删除此属性将是一个开销,它也会影响UI ...... :(

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为将属性发送到服务器并且不属于数据模型的方法非常糟糕。 OData 4.0 spec表示(虽然SAP GW仍然是OData 2.0):

  

6.2有效负载可扩展性

     

根据具体情况,OData支持有效负载的可扩展性   格式。无论格式如何,其他内容都不得   如果接收器需要理解它,则出现   根据指定正确解释有效负载   OData-Version标题。因此,客户和服务必须做好准备   处理或安全地忽略未明确定义的任何内容   OData-Version标头指定的有效负载的版本。

SAP GW"处理"通过取消请求并发回错误请求响应来发现意外的属性。我相信没有选择可以改变这种行为,它也会破坏" OData"。

我假设您在前端使用SAPUI5。有很多方法可以实现你真正想要的东西 - 我对此非常肯定。但改变了真实的"数据,即通过添加"附加"在我的案件中从未需要财产。一种方法是将控件的可编辑属性绑定到类似

的属性
"{view>/editmode}"

您可以猜测这是一个视图模型,也称为"视图模型模式"。它只表示你在控制器中创建一个JSONModel(即在onInit中),然后调用

this.getView().setModel(oModel, "view");

每当您想要禁用/启用对控件集的编辑时,只需调用一次:

var bEditable = ...;  // true or false
//...
this.getView().getModel("view").setProperty("/editMode", bEditable);

另一种选择是拥有2个不同的视图/目标,一个用于editMode,另一个用于显示模式。如果您想关注Fiori指南,我认为您应该使用此选项。它取决于你......

这些选项假设您只使用一个标志来制作"所有"控制是否可编辑。

如果您需要一些其他建议,请务必发布一些代码以更好地说明您的问题。