我正在使用 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>
谢谢