2012-04-11 11 views
0

Ich benutze Mule Studio (Mule 3.2.1CE), um einen Proxy-Dienst zu konfigurieren, der einfach einen Remote-Web-Service aufruft. Alles funktioniert gut mit dem Aufruf und der richtigen Antwort (mit soapUI). Ich möchte SOAP-Nachrichten protokollieren, die im ESB empfangen werden. Ich erhalte eine DepthXMLStreamReader-Nachricht wie von der CXF-Komponente erwartet, aber ich habe ein seltsames Verhalten, wenn ich die next() - Methode des XMLStreamReader-Objekts verwende. Hier ist der Code, die ich benutze:XMLStreamReader-Parser beeinflusst MuleEventContext

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

Der obige Code funktioniert und druckt XML-Elemente, aber ich bekomme die folgende Fehlermeldung danach:

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 

ich versucht, mit StaxUtils.nextEvent und StaxUtils.toNextElement, aber keine Unterschied im Ergebnis. Ich frage mich, warum das Analysieren von XML durch die Methode next() den Kontext von mule beeinflusst. Wenn ich System.out.println (context.getMessageAsString()) verwende; vor der return-Anweisung wird "[messaage konnte nicht in string umgewandelt werden]" gedruckt, aber es funktioniert vor while-Anweisung im obigen Code.

Hier ist mein mule config:

<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> 

Dank

Antwort

0

Ich glaube nicht, dies zu MuleEventContext zusammenhängt.

Die Nutzlast während des Fluges ist ein XMLStreamReader. Sie verbrauchen dieser XMLStreamReader in Ihrer Komponente dann versuchen, eine String-Darstellung davon zurückzugeben, die nicht mehr möglich ist, weil Sie es verbraucht haben.

Versuchen Sie in Ihrer Komponente folgendes:

  • serialisiert die XMLStreamReader in einen String
  • Log diese String oder ein Teil davon
  • Return dieser String aus der Komponente.
Verwandte Themen