首页 > 解决方案 > 在 3.9.0 中工作的 Mule 3.8.0 DataWeave 中的“mapObject”运算符的类型不匹配

问题描述

我构建了一个 API 项目,该项目基于发送到 API 的参数构建 SOAP 请求并将其发送到另一个服务。当我们的生产和开发 Mule 环境是 3.8.0 EE 时,我无意中在 Mule 3.9.0 EE 中构建了该项目。该项目在 3.9.0 本地运行良好,它在 3.8.0 中运行,直到它在 Dataweave 中构建请求。它在 3.8.0 中报告了以下异常:

Root Exception stack trace:
com.mulesoft.weave.engine.ast.dynamic.UnexpectedOperationTypesException: Type mismatch for 'mapObject' operator
     found :array, :function
  required :object, :function

我使用两个 Dataweaves 来构建请求。第一个从参数构建 SOAP 请求中使用的提示。第二个构建 SOAP 请求并插入提示。

第一个数据编织:

%dw 1.0
%output application/json
---
[flowVars.parameterMap mapObject (value, key)->{
    PROMPT: {
        PSQueryName: "",
        UniquePromptName: key,
        FieldValue: value
    }
}]

第二个数据编织:

%dw 1.0
%output application/xml encoding="UTF-8"
%namespace SOAP-ENV  http://schemas.xmlsoap.org/soap/envelope/
%namespace wsse  http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
%namespace qas  http://xmlns.oracle.com/Enterprise/Tools/schemas/QAS_EXEQRY_SYNC_REQ_MSG.VERSION_1
%namespace qas1  http://xmlns.oracle.com/Enterprise/Tools/schemas/QAS_EXEQRY_SYNC_REQ.VERSION_1
---
{
    SOAP-ENV#Envelope: {
        SOAP-ENV#Header: {
            wsse#Security @(SOAP-ENV#mustUnderstand: "1"): {
                wsse#UsernameToken: {
                    wsse#Username: "someUsername",
                    wsse#Password @(Type: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"): "somePassword"
                }
            }
        },
        SOAP-ENV#Body: {
            qas#QAS_EXEQRY_SYNC_REQ_MSG: {
                qas1#QAS_EXEQRY_SYNC_REQ: {
                    QueryName: flowVars.queryName,
                    isConnectedQuery: "N",
                    OwnerType: flowVars.queryType,
                    BlockSizeKB: 0,
                    MaxRow: 0,
                    OutResultType: "webrowset",
                    OutResultFormat: "nonfile",
                    PROMPTS: payload.*PROMPT mapObject {
                        PROMPT: {
                            PSQueryName: $.PSQueryName when $.PSQueryName != "" otherwise {},
                            UniquePromptName: $.UniquePromptName,
                            FieldValue: $.FieldValue
                        }
                    }
                }
            }
        }
    }
}

在 3.9.0 中,Dataweave 完美地转换了 SOAP 请求。在 3.8.0中,PROMPTS: payload.*PROMPT mapObject第二个 DataWeave 中的语句存在问题。

3.9.0 中的哪些变化使它正常工作?

我可以做些什么来解决 3.8.0 中的这个问题?

标签: muletype-mismatchdataweave

解决方案


我通过组合两个 Dataweaves 自己解决了这个问题,事实证明没有必要将两者分开。

它没有回答 3.9.0 中发生的哪些更改允许它在原始项目中工作。

%dw 1.0
%output application/xml encoding="UTF-8"
%namespace SOAP-ENV  http://schemas.xmlsoap.org/soap/envelope/
%namespace wsse  http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
%namespace qas  http://xmlns.oracle.com/Enterprise/Tools/schemas/QAS_EXEQRY_SYNC_REQ_MSG.VERSION_1
%namespace qas1  http://xmlns.oracle.com/Enterprise/Tools/schemas/QAS_EXEQRY_SYNC_REQ.VERSION_1
---
{
    SOAP-ENV#Envelope: {
        SOAP-ENV#Header: {
            wsse#Security @(SOAP-ENV#mustUnderstand: "1"): {
                wsse#UsernameToken: {
                    wsse#Username: "someUser",
                    wsse#Password @(Type: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"): "somePassword"
                }
            }
        },
        SOAP-ENV#Body: {
            qas#QAS_EXEQRY_SYNC_REQ_MSG: {
                qas1#QAS_EXEQRY_SYNC_REQ: {
                    QueryName: flowVars.queryName,
                    isConnectedQuery: "N",
                    OwnerType: flowVars.queryType,
                    BlockSizeKB: 0,
                    MaxRow: 0,
                    OutResultType: "webrowset",
                    OutResultFormat: "nonfile",
                    PROMPTS: flowVars.parameterMap mapObject (value, key)->{
                        PROMPT: {
                            PSQueryName: "",
                            UniquePromptName: key,
                            FieldValue: value
                        }
                    }
                }
            }
        }
    }
}

推荐阅读