[我们有一个第三方通过SAP网关服务中的JSON有效负载向我们的系统下订单。
网关服务的结构保留了JSON中期望的数据结构。
从网关服务中,调用ABAP函数,该函数获取有效负载并创建订单。
我们在ABAP方面有一定程度的错误处理,但是,如果JSON格式完全没有任何问题,则直接从SAP Gateway返回通用500错误,而无需进入ABAP。
所以问题是:有什么办法可以将JSON的特定错误返回给最终用户?
首先,主网关日志位于/IWFND/ERROR_LOG
tcode中。它同时包含系统错误和自定义网关错误,看起来像这样
在SAP Gateway中进行错误记录的一般方法是:
在获取输入参数时完成,它可以是MPC_EXT类的GetEntity
或CreateEntity
方法。当我们谈论订单创建时,可能是CreateEntity
,您可以在其中分析JSON字符串的结构并对其进行验证。分析JSON不在此问题的范围内。
网关中有两种主要的异常类型:/iwbep/cx_mgw_busi_exception
和/iwbep/cx_mgw_tech_exception
,但是由于我们要注入自定义逻辑,因此我们选择前者。
实现异常处理的一般方法是:
IF json_invalid = abap_true.
DATA(lo_message_container) = me->mo_context->get_message_container( ).
lo_message_container->add_message( iv_msg_type = /iwbep/cl_cos_logger=>error
iv_msg_number = '100'
iv_msg_id = 'ZJSO'
iv_add_to_response_header = abap_true
).
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
message_container = lo_message_container.
重要提示:添加消息时不要错过iv_add_to_response_header = abap_true
参数,因此您可以直接读取错误消息作为响应,而无需查看任何日志。
由于您的业务需求包括根据JSON创建订单,因此您可能需要add_messages_from_bapi
方法:
lo_message->add_messages_from_bapi( it_bapi_messages = lt_return_msg ).
它使用了来自订单创建BAPI的确切BAPIRET2结构。
最后,毕竟值得通过/IWFND/TRACE
跟踪有效负载以检查前端有哪些有效负载。