WSO2 ESB中使用Script Mediator去除JSON数组重复元素问题咨询
问题根源
你现有配置的核心错误如下:
- 语法违规:
foreachmediator 不能嵌套在payloadFactory内部,这是网关更新序列失败的直接原因 - 路径不匹配:foreach的JSONPath表达式和你实际返回的
colors数组结构完全不符 - 逻辑错误:在foreach循环内部定义去重数组,每次循环都会重置数组,最终仅能保留最后一个元素
- 参数不匹配:payloadFactory的
$2对应第二个入参,但你仅配置了1个arg,变量调用完全错位 - JS逻辑混乱:代码中同时引用不存在的
payload.results和payload[i],去重结果未存入属性就直接设置payload,后续节点无法读取
可用配置方案
直接使用Script Mediator处理完整数组即可,不需要额外配置foreach mediator,完整序列如下:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="legalCost"> <!-- 直接用JS脚本做数组去重 --> <script language="js"><![CDATA[ // 读取原始payload var originalPayload = mc.getPayloadJSON(); var colorArr = originalPayload.colors; // 数组去重 var uniqueArr = []; for(var i=0; i<colorArr.length; i++){ if(uniqueArr.indexOf(colorArr[i]) === -1){ uniqueArr.push(colorArr[i]); } } // 把去重后的数组存入上下文属性 mc.setProperty("uniqueColors", uniqueArr); ]]></script> <!-- 构造最终输出格式 --> <payloadFactory media-type="json"> <format> { "colors": $1 } </format> <args> <arg evaluator="json" expression="get-property('uniqueColors')"/> </args> </payloadFactory> <property name="messageType" value="application/json" scope="axis2"/> </sequence>
说明
- 如果你实际需要处理的是其他字段的数组,只需要修改JS里读取数组的字段名
colors即可 - 如果需要调整输出的根字段名,直接修改payloadFactory的format结构即可
内容的提问来源于stack exchange,提问作者Hloxx
相关产品推荐
相关产品推荐

