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>
ありがとう