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

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转为字符串,再执行检测。

实现步骤与异常现象

  1. 使用object-to-string-transformer将payload转为字符串:

    <object-to-string-transformer doc:name="Object to string" />
    
  2. 编写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。

  3. 补充完整测试脚本后:

    <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。

问题原因分析

  1. DataWeave中contains的行为差异:
    • 当payload是JSON对象类型时,payload contains "Moscow"检查的是对象的**属性名(键)**是否包含指定字符串,而非属性值。
    • 只有当payload是字符串类型时,contains才会检查字符串内容中是否包含目标关键词。
  2. 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对象,而非字符串。
  3. 重复键导致结果混淆:返回对象中多个同名的isMoscow键会被JSON解析器覆盖,仅保留最后一个值,不利于排查问题。

解决方案

  1. 确保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"
      }
      
  2. 避免重复键:返回对象的键名需唯一,便于查看各检测结果。

内容的提问来源于stack exchange,提问作者GettingStarted With123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:20:28