XMLStreamReader解析器影响MuleEventContext

时间:2012-04-11 12:27:04

标签: mule xmlstreamreader

我正在使用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会影响mule上下文。如果我使用System.out.println(context.getMessageAsString());它在返回语句之前打印“[Messaage无法转换为字符串]”但它在上述代码中的while语句之前有效。

这是我的mule配置:

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

由于

1 个答案:

答案 0 :(得分:0)

我不认为这与MuleEventContext有关。

正在进行的有效负载是XMLStreamReader。你在你的组件中使用这个XMLStreamReader然后尝试返回它的String表示,这是不可能的,因为你已经消耗它了。

在您的组件中尝试以下操作:

  • 将XMLStreamReader序列化为String
  • 记录此字符串或其中的一部分
  • 从组件返回此String。