我在OData v2模型上执行批处理更新,该模型包含多个操作。 更新是在单个变更集中执行的,因此单个失败的操作会使整个更新失败。
如果一项操作失败(由于业务逻辑),则返回一条消息。有没有办法知道哪个操作触发了消息?我得到的响应包含消息文本,而似乎没有其他有用的消息。
对于每个失败的操作都会触发错误功能,并且每次都会包含相同的消息。
也许应该以特定的方式在SAP后端发布消息? ABAP方法/ iwbep / if_message_container-> ADD_MESSAGE具有参数IV_KEY_TAB,但似乎没有影响。
编辑: 对话后澄清。 我的服务不返回消息列表,而是执行更新。如果更新操作之一失败并显示一条消息,我希望将消息连接到失败的特定更新,最好不要修改消息文本。 我收到的错误响应示例:
{
"error":{
"code":"SY/530",
"message":{
"lang":"en",
"value":"<My message text>"
},
"innererror":{
"application":{
"component_id":"",
"service_namespace":"/SAP/",
"service_id":"<My service>",
"service_version":"0001"
},
"transactionid":"",
"timestamp":"20181231084555.1576790",
"Error_Resolution":{
// Sap standard message here
},
"errordetails":[
{
"code":"<My message class>",
"message":"<My message text>",
"propertyref":"",
"severity":"error",
"target":""
},
{
"code":"/IWBEP/CX_MGW_BUSI_EXCEPTION",
"message":"An exception was raised.",
"propertyref":"",
"severity":"error",
"target":""
}
]
}
}
}
答案 0 :(得分:0)
如果您想为所有操作保留相同的确切消息,那么能够确定消息来源的最简单方法就是在后端添加特定的“标签”。
例如,您可以为每个操作使用特定值填充消息结构的PARAMETER字段。这样,您可以轻松确定网关或前端中的来源。
答案 1 :(得分:0)
如果我正确理解了您的问题,则可以尝试以下操作。
覆盖以下DPC方法:
changeset_begin:将cv_defer_mode设置为abap_true
changeset_end:重新定义它,里面没有任何内容
changeset_process:
在这里您可以在表中找到请求的列表,该列表中包含操作号(即您要查找的内容)以及调用的键值结构(iwbep.blablabla)。 循环遍历表,并为每个条目调用方法。
将每个操作的结果放入CT_CHANGESET_RESPONSE。
如果一项操作失败,则可以在其中提出busi_exception,然后可以在其中访问实际的操作号。
有关批处理的更多信息,您可以查看以下链接: https://blogs.sap.com/2018/05/06/batch-request-in-sap-gateway/
那是你的意思吗?