0

Mule Studio (Mule 3.2.1CE) を使用して、単にリモート Web サービスを呼び出すプロキシ サービスを構成しています。(soapUI を使用して) 適切な応答を呼び出して取得することで、すべてが正常に機能します。ESB 内で受信した SOAP メッセージをログに記録したいと考えています。CXF コンポーネントが期待するように DepthXMLStreamReader メッセージを受け取りましたが、XMLStreamReader オブジェクトの next() メソッドを使用すると奇妙な動作に直面しています。私が使用するコードは次のとおりです。

public Object onCall(MuleEventContext context) throws Exception {
    MuleMessage message = context.getMessage();
    DepthXMLStreamReader streamReader = new DepthXMLStreamReader((XMLStreamReader) message.getPayload());

    while(streamReader.hasNext()){
                streamReader.next();
                if(streamReader.getEventType() == XMLStreamReader.START_ELEMENT)
                {
                    System.out.println(streamReader.getLocalName());
                }
            }
    return context.getMessageAsString();

上記のコードは動作し、XML 要素を出力しますが、後で次のエラーが発生します。

 org.apache.cxf.interceptor.Fault: Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=..., connector=HttpConnector
...
    Caused by: org.mule.transport.http.HttpResponseException: Internal Server Error, code: 500

StaxUtils.nextEvent と StaxUtils.toNextElement を使用してみましたが、結果に違いはありませんでした。next() メソッドによる XML の解析がミュール コンテキストに影響するのはなぜでしょうか。System.out.println(context.getMessageAsString()); を使用する場合 returnステートメントの前に「[メッセージを文字列に変換できませんでした]」が出力されますが、上記のコードのwhileステートメントの前で機能します。

ここに私のラバの設定があります:

<flow name="wsFlow1" doc:name="wsFlow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8090" contentType="text/xml" doc:name="HTTP"/>
    <cxf:proxy-service bindingId="..." namespace="http://..." service="..." payload="body" wsdlLocation="..." enableMuleSoapHeaders="false" doc:name="SOAP"/>
    <component class="mule.ws.SoapLogging" doc:name="Java"/>
    <http:outbound-endpoint exchange-pattern="request-response" address="http://..." contentType="text/xml" doc:name="HTTP"/>
</flow>

ありがとう

4

1 に答える 1

0

これは MuleEventContext とは関係ないと思います。

飛行中のペイロードは XMLStreamReader です。コンポーネントでこの XMLStreamReaderを使用してから、その String 表現を返そうとしますが、これは使用済みであるため不可能です。

コンポーネントで次のことを試してください。

  • XMLStreamReader を文字列にシリアライズする
  • この文字列またはその一部をログに記録します
  • コンポーネントからこの文字列を返します。
于 2012-04-11T15:08:48.907 に答える