如何基于EnrichMediator错误信息配置Fault Sequence?
我来帮你搞定这个问题——你想要在Enrich Mediator处理失败时触发自定义的Fault Sequence,而不是直接把原始响应返回给客户端,对吧?结合你遇到的EnrichMediator Specified node by xpath can not found错误,我给你分步骤的解决方案:
一、创建并关联自定义Fault Sequence
首先你需要定义一个专属的Fault Sequence来处理Enrich的错误,然后把它和Enrich Mediator绑定:
新建Fault Sequence
打开WSO2 EI/APIM的Carbon控制台,进入Sequence页面,创建一个新的Fault Sequence(比如命名为EnrichErrorHandler)。在这个序列里,你可以完全自定义错误响应的格式、状态码,还能记录日志方便排查。给你个示例配置:<sequence name="EnrichErrorHandler" trace="enable" xmlns="http://ws.apache.org/ns/synapse"> <!-- 记录错误详情到日志 --> <log level="custom"> <property name="ERROR_TYPE" value="ENRICH_MEDIATOR_FAILURE"/> <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/> <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/> </log> <!-- 生成标准化的错误响应 --> <payloadFactory media-type="json"> <format> { "code": "$1", "message": "$2", "detail": "Enrich mediator failed to locate specified XPath node" } </format> <args> <arg expression="get-property('ERROR_CODE')"/> <arg expression="get-property('ERROR_MESSAGE')"/> </args> </payloadFactory> <!-- 设置HTTP 500状态码 --> <property name="HTTP_SC" value="500" scope="axis2"/> <!-- 把自定义响应返回给客户端 --> <respond/> </sequence>把Enrich Mediator关联到这个Fault Sequence
找到你使用Enrich的那个Sequence,给Enrich标签加上onError属性,值就是刚才创建的Fault Sequence名称。比如:<enrich description="Customize Client Response" onError="EnrichErrorHandler"> <source type="xpath" xpath="//your/target/node"/> <target type="body"/> </enrich>这样一来,只要这个Enrich Mediator执行失败(比如找不到XPath节点),就会自动跳转到
EnrichErrorHandler序列处理,不会直接返回原始响应了。
二、提前预防XPath节点找不到的错误
除了事后捕获错误,你还可以在Enrich之前先检查节点是否存在,从源头避免进入Fault Sequence:
用Filter Mediator做前置检查,如果节点不存在就直接返回友好错误:
<filter description="Check Target Node Exists" xpath="boolean(//your/target/node)"> <then> <!-- 节点存在,正常执行Enrich --> <enrich> <source type="xpath" xpath="//your/target/node"/> <target type="body"/> </enrich> </then> <else> <!-- 节点不存在,直接返回自定义错误 --> <payloadFactory media-type="json"> <format> { "code": "NODE_NOT_FOUND", "message": "Required data node not found in backend response" } </format> <args/> </payloadFactory> <property name="HTTP_SC" value="400" scope="axis2"/> <respond/> </else> </filter>
如果业务允许节点不存在时用默认值填充,也可以直接在XPath里处理:
<enrich> <source type="xpath" xpath="if (//your/target/node) then //your/target/node else 'default_value'"/> <target type="body"/> </enrich>
三、验证配置
配置完之后,你可以模拟后端返回没有指定XPath节点的响应,测试一下是否会触发你定义的Fault Sequence,返回你自定义的错误内容。同时可以查看Carbon控制台的日志,确认错误信息是否正确记录,流程是否按预期执行。
内容的提问来源于stack exchange,提问作者mahdouch gara

