You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于EnrichMediator错误信息配置Fault Sequence?

解决Enrich Mediator失败时触发自定义Fault Sequence的问题

我来帮你搞定这个问题——你想要在Enrich Mediator处理失败时触发自定义的Fault Sequence,而不是直接把原始响应返回给客户端,对吧?结合你遇到的EnrichMediator Specified node by xpath can not found错误,我给你分步骤的解决方案:

一、创建并关联自定义Fault Sequence

首先你需要定义一个专属的Fault Sequence来处理Enrich的错误,然后把它和Enrich Mediator绑定:

  1. 新建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>
    
  2. 把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:58:28