0

グルーヴィーな表現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)

私は何が間違っているのでしょうか?

ありがとう。

4

2 に答える 2

1

問題は、expression-transformerとが でscripting:transformer使用するものとは異なるバインディングのセットを使用することです。scripting:componentこれは、 で異なるメソッドを呼び出すためorg.mule.module.scripting.component.Scriptableです。

さらに、originalPayloadバインドされると、間違った値になります。

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

したがって: MULE-6215

于 2012-05-04T18:51:12.510 に答える
0

Scripting Module Referenceに従うと、それらは同じである必要があります。

また、スクリプト モジュールの 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());
    }
}
于 2012-05-04T00:14:57.910 に答える