在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中集成这个脚本
- 在你的API/Proxy序列里添加一个Script Mediator,选择语言为
DataWeave,把上面的脚本粘贴进去(或者存在MI的配置仓库里用key引用) - 用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
相关产品推荐
相关产品推荐

