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