Ошибка несоответствия типа, возвращаемая из-за другого типа сообщений, возвращаемых в Mule

#json #xml #mule #anypoint-studio #dataweave

#json #xml #mule #anypoint-studio #dataweave

Вопрос:

У меня есть рабочий процесс Mule, который может либо получать ответное сообщение, либо сообщение о бизнес-ошибке в качестве входных данных в соединитель сообщений преобразования.

Когда он переходит от соединителя сообщений преобразования к объекту в строку, он выдает эту ошибку:

 ERROR 2016-10-07 18:08:40,187 [[userprocess].userprocess-httpListenerConfig.worker.01] org.mule.exception.DefaultMessagingExceptionStrategy: 
********************************************************************************
Message               : Exception while executing: 
    }) when ((payload[0].userResponse != null and payload[0].userResponse.category == "SUCCESS")) and
                         ^
Type mismatch
     found :name, :string
  required :name, :object
Type                  : com.mulesoft.weave.mule.exception.WeaveExecutionException
Code                  : MULE_ERROR--2
********************************************************************************
Exception stack is:
1. Type mismatch
     found :name, :string
  required :name, :object (com.mulesoft.weave.engine.ast.dynamic.DynamicDispatchException)
  com.mulesoft.weave.engine.ast.dynamic.DynamicDispatchNode:65 (null)
2. Exception while executing: 
    }) when ((payload[0].userResponse != null and payload[0].userResponse.category == "SUCCESS")) and
                         ^
Type mismatch
     found :name, :string
  required :name, :object (com.mulesoft.weave.mule.exception.WeaveExecutionException)
  com.mulesoft.weave.mule.WeaveMessageProcessor$WeaveOutputHandler:166 (null)
********************************************************************************
Root Exception stack trace:
com.mulesoft.weave.engine.ast.dynamic.DynamicDispatchException: Type mismatch
     found :name, :string
  required :name, :object
  

Я думаю, это потому, что, когда сообщение обрабатывается с помощью transform message, оно выполняет логику, основанную на разных полях, поэтому мне нужно сделать, чтобы исправить это, — игнорировать любую логику ответного сообщения, если возвращается сообщение о бизнес-ошибке, и наоборот.

Как я могу это сделать?

Код отправки данных (из JSON в XML):

 %dw 1.0
%output application/xml
---
{
    (Data: {
        userId: flowVars.queryParams.userId,
        Message: "User created successfully"
    }) when (payload[0].userResponse.category == "SUCCESS") and
            (payload[1].userResponse.category == "SUCCESS"),            

    (Exception: {
        userId: flowVars.queryParams.userId,
        Message: payload[1].exception.message
        }) when (payload.exception?) and 
                (payload[1].exception.action == "createUser") and
                (payload[0].exception.code != "-1"),
    (Exception: {
       userId: flowVars.queryParams.userId,
       Message: payload[0].exception.message
       }) when (payload.exception?) and 
            (payload[0].exception.action == "amendUser") and
            (payload[1].exception.replyStatus.code != "-1"),
}
  

Ответ №1:

В этой ситуации вы можете использовать when / иначе. Вы были близки, просто используйте { и } вместо скобок. Что-то вроде:

 %dw 1.0
%input payload application/json
%output application/xml
---
{
    Data: {
        userId: flowVars.queryParams.userId,
        Message: "User created successfully"
    }
}
when (payload[0].userResponse.category == "SUCCESS") and
     (payload[1].userResponse.category == "SUCCESS"))
otherwise
{
    Exception: {
        userId: flowVars.queryParams.userId,
        Message: payload[1].exception.message
    }
}
  

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

1. Привет. Я все еще получаю ту же ошибку, даже если приведенный выше код вырезан и вставлен. Также мне нужно добавить третье правило, поэтому я обновил приведенный выше код dataweave. Спасибо

2. Как выглядит ваша полезная нагрузка? @user3165854

3. Привет. Все в порядке. Я обнаружил, что эта проверка объекта сработала для меня «когда (полезная нагрузка [0].userResponse?) и …». Он проверяет, присутствует ли объект userResponse