2

以下の Mule 構成と Java コードを使用すると、コンポーネント バインディングを介して Mule に例外を伝播させることができません。リモート サービスでスローされた例外を取得して、呼び出し元のコンポーネントに伝達するにはどうすればよいですか? ミュール EE 3.2.2

ありがとう

Mule 構成

<mule ...>
    <flow name="Test">
    <vm:inbound-endpoint path="Test" exchange-pattern="request-response" />
    <component class="foo.Component">
        <binding interface="foo.Interface" method="bar">
                <vm:outbound-endpoint path="Interface.bar"
                    exchange-pattern="request-response" />
        </binding>
        </component>
    </flow>

    <flow name="Interface.bar">
        <vm:inbound-endpoint path="Interface.bar" 
            exchange-pattern="request-response" />
        <scripting:component>
            <scripting:script engine="groovy">
                throw new Exception();
            </scripting:script>
        </scripting:component>
    </flow>
</mule>

Java コード

コンポーネント.java

package foo;

public class Component {

    private Interface theInterface;

    public void foo(final String unused) throws Exception {
        theInterface.bar();
    }

    public void set(final Interface anInterface) {
        theInterface = anInterface;
    }

}

インターフェイス.java

package foo;

public interface Interface {

    String bar() throws Exception;

}

ドライバ

package foo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import org.mule.api.MuleException;
import org.mule.api.client.MuleClient;
import org.mule.tck.junit4.FunctionalTestCase;


@RunWith(MockitoJUnitRunner.class)
public class ATest extends FunctionalTestCase {

    @Test(expected = Exception.class)
    public void willItThrowException() throws MuleException {
        final MuleClient client = muleContext.getClient();
        client.send("vm://Test", "", null, RECEIVE_TIMEOUT);
    }

    @Override
    protected String getConfigResources() {
        return "app/mule-config.xml";
    }

}
4

1 に答える 1

2

例外は、メッセージ交換を通じて「スローされた例外」として伝播されるのではなく、進行中のメッセージの例外ペイロードとして伝播されます。

したがって、呼び出しの応答は、vm://Interface.barスローした例外で設定された例外ペイロードを持つメッセージである必要があります。バインディングはメイン ペイロードをインターフェイスにバインドするため、コンポーネントからアクセスする方法はありません。

Interface.bar1 つのオプションは、例外ペイロード (存在する場合) をメイン ペイロードにコピーし、bar() がオブジェクト (場合によっては文字列、場合によっては例外) を返せるようにする応答トランスフォーマーをフローに追加することです。または、String のままにして、返されるエラーの規則を String として定義します。

于 2012-06-07T22:05:22.670 に答える