originalPayload не совпадает с message.originalPayload в отличных скриптах

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

с originalPayload:

<expression-transformer evaluator="groovy" expression="originalPayload" />

с message.originalPayload:

<expression-transformer evaluator="groovy" expression="message.originalPayload" />

Для воспроизведения проблемы можно использовать следующую конфигурацию мула и контрольный пример:

<mule ...>
    <flow name="test">
        <vm:inbound-endpoint name="test.Name" path="test.Path"
            exchange-pattern="request-response" />

        <expression-transformer evaluator="string" expression="bar" />

        <expression-transformer evaluator="groovy" expression="originalPayload" />
        <!-- or alternatively -->
        <!-- <expression-transformer evaluator="groovy" expression="message.originalPayload" /> -->
    </flow>
</mule>

Контрольный пример может быть:

@Test
public void transformers() throws MuleException {
    final MuleClient client = muleContext.getClient();
    final MuleMessage reply = client.send("vm://test.Path", 1, null, RECEIVE_TIMEOUT);
    assertEquals(1, reply.getPayload());
}

Альтернатива с message.originalPayload работает как положено. Тот, с originalPayload нет и в журналах показано следующее исключение:

Exception stack is:
1. Expression Evaluator "groovy" with expression "originalPayload" returned null 
but a value was required. (org.mule.api.expression.RequiredValue Exception)

Что я могу делать не так?

Благодарю.

2 ответа

Решение

Проблема в том, что expression-transformer а также scripting:transformer использовать другой набор привязок, чем тот, который используется scripting:component, и это потому, что они вызывают другой метод в org.mule.module.scripting.component.Scriptable,

Более того, когда originalPayload связывается, это с неправильным значением:

bindings.put("originalPayload", event.getMessage().getPayload());

Отсюда: MULE-6215

Следуя Справочнику по скриптовому модулю, они должны быть одинаковыми.

Кроме того, если вы посмотрите на org.mule.module.scripting.component.Scriptable в модуле сценариев, вы обнаружите, что "originalPayload" - это message.getPayload.

Можете ли вы опубликовать небольшой проект, воспроизводящий ошибку?

public void populateBindings(Bindings bindings, MuleMessage message)
{
    populateDefaultBindings(bindings);
    if (message == null)
    {
        message = new DefaultMuleMessage(NullPayload.getInstance(), muleContext);
    }
    bindings.put("message", message);
    //This will get overwritten if populateBindings(Bindings bindings, MuleEvent event) is called
    //and not this method directly.
    bindings.put("payload", message.getPayload());
    //For backward compatability
    bindings.put("src", message.getPayload());
}

public void populateBindings(Bindings bindings, MuleEvent event)
{
    populateBindings(bindings, event.getMessage());
    bindings.put("originalPayload", event.getMessage().getPayload());
    bindings.put("payload", event.getMessage().getPayload());
    bindings.put("eventContext", new DefaultMuleEventContext(event));
    bindings.put("id", event.getId());
    bindings.put("flowConstruct", event.getFlowConstruct());
    if (event.getFlowConstruct() instanceof Service)
    {
        bindings.put("service", event.getFlowConstruct());
    }
}
Другие вопросы по тегам