mule - 在 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 中的这个问题?
解决方案
我通过组合两个 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
}
}
}
}
}
}
}
推荐阅读
- bash - 如何将环境变量替换为文本文件
- macos - IntelliJ IDEA - 此环境中不提供编译器。也许您在 JRE 而不是 JDK 上运行?
- css - 如何在圆圈下方放置线条?没有 z-index
- python - 抑制 Tensorflow 警告
- python - 无法从 shell 脚本激活 conda env
- javascript - 如何在我制作的这个小游戏中添加延迟动画和记分牌
- java - 如何确定 thrift 消息的类型?
- django - 当用户执行两次注册方法时如何发送确认电子邮件?
- python - 运行一个函数会阻止机器人 - discord.py
- null - 当字段为最小值且 ATHENA 中为 Null 时,赋值 1