2012-04-11 46 views
0

我正在使用Mule Studio(Mule 3.2.1CE)來配置只調用遠程Web服務的代理服務。一切工作正常與調用和獲得正確的響應(使用soapUI)。我想記錄在ESB中收到的SOAP消息。我得到了CXF組件所期望的DepthXMLStreamReader消息,但是當我使用XMLStreamReader對象的next()方法時,我正面臨一個奇怪的行爲。下面是我的代碼使用方法:XMLStreamReader解析器影響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(); 

上面的代碼工作,並打印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會影響mule上下文。如果我使用System.out.println(context.getMessageAsString());在返回語句之前它會打印「[Messaage無法轉換爲字符串]」,但它在上面的代碼中的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> 

感謝

回答

0

我不認爲這是關係到MuleEventContext。

機上有效載荷是一個XMLStreamReader。你消耗這個XMLStreamReader在你的組件中,然後嘗試返回它的字符串表示形式,這是不可能的,因爲你已經使用它了。

嘗試在你的組件如下:

  • 序列化的XMLStreamReader爲String
  • 登錄該字符串或部分
  • 返回此String從組件。