我正在使用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>
由于
答案 0 :(得分:0)
我不认为这与MuleEventContext有关。
正在进行的有效负载是XMLStreamReader。你在你的组件中使用这个XMLStreamReader然后尝试返回它的String表示,这是不可能的,因为你已经消耗它了。
在您的组件中尝试以下操作: