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

WSO2 Enrich Mediator替换Payload属性值失败问题求助

问题排查与解决:Enrich Mediator无法替换Payload空值

问题场景

使用Enrich Mediator构造包含学生姓名(nom)和总分(totalnote)的Payload,期望用已定义的属性值替换Payload中的空值,但配置后返回结果始终为空值。

现有配置

<property expression="get-property('uri.var.nom')" name="uri.var.nom" scope="default" type="STRING"/>
<property expression="get-property('totalnote')" name="totalnote" scope="default" type="STRING"/>
<enrich>
    <source clone="true" type="inline">
        {"nom":"" ,
        "note":""}
    </source>
    <target action="child" xpath="json-eval($)"/>
</enrich>
<enrich>
    <source clone="true" property="uri.var.nom" type="property"/>
    <target action="replace" xpath="json-eval($.etudiants.nom)"/>
</enrich>
<enrich>
    <source clone="true" property="totalnote" type="property"/>
    <target action="replace" xpath="json-eval($.etudiants.note)"/>
</enrich>
<respond/>

错误返回结果

{ "etudiants": { "nom": "", "note": "" } }

问题原因

  1. Payload结构不匹配:第一个Enrich生成的结构是{"nom":"", "note":""},但后续替换操作的XPath指向$.etudiants.nom/$.etudiants.note,目标节点不存在,导致替换失败。
  2. 冗余的Property配置:第一个<property>中name="uri.var.nom"与expression="get-property('uri.var.nom')"属于循环引用,若uri.var.nom已存在,无需重复定义。

修正方案

方案1:对齐初始Payload与XPath结构

修改第一个Enrich的inline source,生成包含etudiants节点的结构:

<!-- 若uri.var.nom已通过URI参数传入,无需重复定义该property -->
<property expression="get-property('totalnote')" name="totalnote" scope="default" type="STRING"/>

<enrich>
    <source clone="true" type="inline">
        {"etudiants": {"nom":"", "note":""}}
    </source>
    <target action="replace" xpath="json-eval($)"/>
</enrich>

<enrich>
    <source clone="true" property="uri.var.nom" type="property"/>
    <target action="replace" xpath="json-eval($.etudiants.nom)"/>
</enrich>

<enrich>
    <source clone="true" property="totalnote" type="property"/>
    <target action="replace" xpath="json-eval($.etudiants.note)"/>
</enrich>

<respond/>

方案2:调整XPath匹配初始结构

若不需要etudiants节点,修改替换操作的XPath路径:

<property expression="get-property('uri.var.nom')" name="uri.var.nom" scope="default" type="STRING"/>
<property expression="get-property('totalnote')" name="totalnote" scope="default" type="STRING"/>

<enrich>
    <source clone="true" type="inline">
        {"nom":"" , "note":""}
    </source>
    <target action="replace" xpath="json-eval($)"/>
</enrich>

<enrich>
    <source clone="true" property="uri.var.nom" type="property"/>
    <target action="replace" xpath="json-eval($.nom)"/>
</enrich>

<enrich>
    <source clone="true" property="totalnote" type="property"/>
    <target action="replace" xpath="json-eval($.note)"/>
</enrich>

<respond/>

额外优化提示

  • 若uri.var.nom是通过URI参数(如/api?nom=张三)传入,可直接在Enrich中引用,无需额外定义<property>。
  • 确认totalnote属性已在前置流程中正确赋值,否则替换后仍会为空。

内容的提问来源于stack exchange,提问作者rania ben salem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:20:39