在Mule 3.8.5中涉及JSON Payload的Dataweave转换出错

时间:2018-05-23 19:16:42

标签: json mule mule-component dataweave mule-esb

我在JSON Payload上使用dataweave转换时遇到错误。 JSON Payload是

module.exports = {
  context: path.resolve(__dirname, '../'),
  entry: {
    app: ['babel-polyfill', './src/main.js']
  },

上面的有效负载由RESTful服务返回,我在使用byteArray到Object转换器之前将其转换为对象,然后再应用以下数据转换

{
    "requestId": "13431#1638a2abfb8",
    "result": [
        {
            "batchId": 1028,
            "importId": "1028",
            "status": "Queued"
        }
    ],
    "success": true
}

我期待结果对象只有一条记录,我检查数组是否为null或其大小是否为> 0。执行转换代码时出现以下错误。不知道这里有什么问题。

我期待转换的以下输出,但我在执行转换代码时遇到错误

%dw 1.0
%output application/json
---
batchexecution:
 {
    batchid:payload.result[0].batchid,
    status: payload.result[0].status,
    success:payload.success 
 }  when ((payload.result != null) and (sizeOf payload.result  > 0)) 
 otherwise
 {
    batchid: 0,
    status:"Not queued",
    success:false
 }

但是我收到以下错误你无法比较type :: array的值。

{
    "batchexecution": {
        "batchId": 1028,
        "status": "Queued",
        "success": true
    }
}

2 个答案:

答案 0 :(得分:1)

这里的问题并不明显,但我之前遇到过同样的问题 - 它与 sizeOf 函数有关,而且Mule对其某些运算符应用优先级的方式很差。当你说(sizeOf payload.result > 0)它首先试图解决payload.result > 0表达式时 - 因此你看到的错误(它试图将数组比较为0)。

请改用((sizeOf payload.result) > 0)(因为这个原因,我总是在括号中包围 sizeOf )。

作为旁注,您有batchid:payload.result[0].batchid - 它应为batchId:payload.result[0].batchIdbatchId中的大小写)

答案 1 :(得分:0)

无论何时在dataweave中使用诸如sizeOf之类的任何函数时,都应尝试使用圆括号将其封装,以避免此类错误。

@ghoshyTech您的情况

   when ((payload.result != null) and ((sizeOf payload.result)  > 0))