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": "" } }
问题原因
- Payload结构不匹配:第一个Enrich生成的结构是
{"nom":"", "note":""},但后续替换操作的XPath指向$.etudiants.nom/$.etudiants.note,目标节点不存在,导致替换失败。 - 冗余的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
相关产品推荐
相关产品推荐

