Несоответствие типа для оператора ‘MapObject’ в Mule 3.8.0 DataWeave, который работал в версии 3.9.0

#mule #type-mismatch #dataweave

#mule #несоответствие типа #dataweave

Вопрос:

Я создал проект API, который создает и отправляет SOAP-запрос другой службе на основе параметров, отправленных в API. Я непреднамеренно собрал проект в Mule 3.9.0 EE, когда наши производственные среды и среды разработки Mule являются 3.8.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
  

Я использую два потока данных для построения запроса. Первый создает подсказки, используемые в запросе SOAP, на основе параметров. Второй создает запрос SOAP и вставляет подсказки.

Первый Dataweave:

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

Второй Dataweave:

 %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?

Ответ №1:

Я решил это самостоятельно, объединив два потока данных, разделение которых оказалось ненужным.

Он не отвечает, какие изменения произошли в 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
                        }
                    }
                }
            }
        }
    }
}
  

Комментарии:

1. Скорее всего, это ошибка в версии 3.8.0, которую вы можете попробовать, обновив до последней версии 3.8.6, или, по крайней мере, обновите только плагин DW