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

在WSO2 Micro Integrator中检查JSON输入的重复language字段值

在WSO2 Micro Integrator中检查JSON输入的重复language字段值

嗨,我刚好之前在WSO2 MI里处理过类似的问题!确实JSON Schema没法直接校验数组里的重复字段值,不过咱们用MI自带的工具就能搞定,给你分享两个实用的方案:

方案一:用DataWeave 2.0脚本快速校验

DataWeave是MI里处理JSON最顺手的工具,写个简单的脚本就能轻松检测重复的language值,还能直接定位出重复的内容。

校验脚本示例

你可以写一个DataWeave脚本,先提取所有displayNames里的language字段,通过对比原数组和去重后数组的长度判断是否有重复,还能列出具体重复的language值:

%dw 2.0
output application/json
// 定义函数:判断是否存在重复language
fun hasDuplicateLanguages(payload) = 
    sizeOf(payload.displayNames.language) != sizeOf(payload.displayNames.language distinctBy $)
---
{
    hasDuplicates: hasDuplicateLanguages(payload),
    // 提取所有重复的language值
    duplicateLanguages: payload.displayNames.language 
        groupBy $ 
        filter ((value, key) -> sizeOf(value) > 1) 
        pluck $$
}

在MI中集成这个脚本

  1. 在你的API/Proxy序列里添加一个Script Mediator,选择语言为DataWeave,把上面的脚本粘贴进去(或者存在MI的配置仓库里用key引用)
  2. 用Filter Mediator判断脚本返回的hasDuplicates字段:
    • 如果是true,用Respond Mediator返回400错误,提示用户存在重复值
    • 如果是false,继续执行后续的业务逻辑

比如错误响应的返回内容可以设置成这样:

{
    "error": "Duplicate language values detected",
    "duplicate_languages": ["en"]
}

方案二:用Iterate Mediator遍历校验(适合习惯XML中介的场景)

如果你更习惯用MI的XML中介组件,也可以用Iterate Mediator遍历数组,逐个检查language是否重复:

  • 先初始化一个空的seenLanguages属性,用来存储已经出现过的language值
  • 用Iterate Mediator遍历displayNames数组
  • 每次遍历提取当前的language值,用Filter Mediator检查它是否在seenLanguages里:
    • 如果存在:立即终止遍历,用Respond Mediator返回错误
    • 如果不存在:把这个language值追加到seenLanguages里,继续下一个元素

不过这个方法相对繁琐,代码量比DataWeave多不少,所以更推荐第一种方案。

完整的Proxy示例(参考)

这里给你一个完整的Proxy配置参考,把DataWeave校验逻辑整合进去:

<proxy name="CheckDuplicateLanguageProxy" startOnLoad="true" transports="http https" xmlns="http://ws.apache.org/ns/synapse">
    <target>
        <inSequence>
            <!-- 执行DataWeave校验脚本 -->
            <script language="dw">
                %dw 2.0
                output application/json
                fun hasDuplicateLanguages(payload) = 
                    sizeOf(payload.displayNames.language) != sizeOf(payload.displayNames.language distinctBy $)
                ---
                {
                    hasDuplicates: hasDuplicateLanguages(payload),
                    duplicateLanguages: payload.displayNames.language 
                        groupBy $ 
                        filter ((value, key) -> sizeOf(value) > 1) 
                        pluck $$
                }
            </script>
            <!-- 检查是否存在重复 -->
            <filter source="json-eval($.hasDuplicates)" regex="true">
                <then>
                    <!-- 返回错误响应 -->
                    <respond>
                        <payloadFactory media-type="json">
                            <format>{"error": "Duplicate language values found", "duplicate_languages": $1}</format>
                            <args>
                                <arg evaluator="json" expression="$.duplicateLanguages"/>
                            </args>
                        </payloadFactory>
                        <property name="HTTP_SC" value="400" scope="axis2"/>
                    </respond>
                </then>
                <else>
                    <!-- 无重复,继续业务逻辑 -->
                    <log level="custom">
                        <property name="Status" value="No duplicate languages detected"/>
                    </log>
                    <!-- 这里添加你的实际业务处理逻辑 -->
                </else>
            </filter>
        </inSequence>
        <outSequence>
            <send/>
        </outSequence>
    </target>
</proxy>

这个配置会在请求进入时自动校验,如果发现重复的language值,直接返回400错误并告知具体重复的内容,非常直观。

备注:内容来源于stack exchange,提问作者prime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:29:34