DataWeave 1.0(Mule 3)全局检测payload含'Moscow'结果异常求助
问题:全局检测JSON Payload中是否包含关键词失败排查
需求与背景
需要接收携带JSON payload的POST请求,检测payload任意位置是否包含关键词Moscow(不针对特定字段)。示例payload如下:
{ "city": "Paris", "zip": "123", "street" : "some street name" }
由于要适配不同格式的payload端点,不想逐个字段检查,计划先将payload转为字符串,再执行检测。
实现步骤与异常现象
使用
object-to-string-transformer将payload转为字符串:<object-to-string-transformer doc:name="Object to string" />编写DataWeave脚本检测关键词:
<dw:transform-message doc:name="Transform"> <dw:set-payload><![CDATA[%dw 1.0 %output application/json --- { payload contains "Moscow" } ]]></dw:set-payload> </dw:transform-message>调试模式下评估含
Moscow的payload会返回True,但实际运行始终返回False。补充完整测试脚本后:
<byte-array-to-string-transformer doc:name="Byte Array to String"/> <dw:transform-message doc:name="Transform Message"> <dw:set-payload><![CDATA[%dw 1.0 %output application/json %var result1 = payload contains "Moscow" %var result2 = payload.city contains "Moscow" --- { "isMoscow" : payload contains "Moscow", "isMoscow" : result1 as :string, "isMoscow" : result2 }]]></dw:set-payload> </dw:transform-message>发送测试payload:
{ "city": "Moscow", "zip": "123", "street" : "some street name" }返回结果:
{ "isMoscow": false, "isMoscow": "false", "isMoscow": true }可见仅针对
payload.city的字段级检测返回True,全局检测始终返回False。
问题原因分析
- DataWeave中
contains的行为差异:- 当payload是JSON对象类型时,
payload contains "Moscow"检查的是对象的**属性名(键)**是否包含指定字符串,而非属性值。 - 只有当payload是字符串类型时,
contains才会检查字符串内容中是否包含目标关键词。
- 当payload是JSON对象类型时,
- Transformer未生效/顺序错误:
- 你添加的
byte-array-to-string-transformer可能覆盖了object-to-string-transformer的效果,导致payload并未转为预期的JSON字符串。 - Mule默认会根据请求的
Content-Type自动解析payload为JSON对象,若object-to-string-transformer之后没有锁定payload类型,进入DataWeave时payload已经被重新解析为JSON对象,而非字符串。
- 你添加的
- 重复键导致结果混淆:返回对象中多个同名的
isMoscow键会被JSON解析器覆盖,仅保留最后一个值,不利于排查问题。
解决方案
- 确保payload以字符串类型进入DataWeave:
- 移除多余的
byte-array-to-string-transformer,仅保留object-to-string-transformer,并确保后续组件不会自动解析payload为JSON对象。 - 或者直接在DataWeave中将JSON对象转为字符串后检测,无需依赖Transformer:
%dw 1.0 %output application/json --- { globalCheck: write(payload, "application/json") contains "Moscow", fieldCheck: payload.city contains "Moscow" }
- 移除多余的
- 避免重复键:返回对象的键名需唯一,便于查看各检测结果。
内容的提问来源于stack exchange,提问作者GettingStarted With123
相关产品推荐
相关产品推荐

