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());
}
}