Details
-
Type:
Bug
-
Status:
Closed
-
Priority:
Critical
-
Resolution: Fixed
-
Affects Version/s: 2.2.6 (EE only), 3.0.0
-
Fix Version/s: 2.2.7 (EE only), 3.0.1
-
Component/s: Modules: CXF
-
Labels:None
-
User impact:High
-
Similar Issues:None
Description
This issue was created to track the fix for the EE-2002 issue.
This is the original comment from it:
I have tested the Mule 2.2.7 fix against one of our test services. The
service in question no longer throws a TransformerException but the
request still fails with the following exception....
WARNING: Interceptor for
{http://ctp.wcsl.com/wsdl/LottoWager-v1}LottoWagerBinding_v1_0 has
thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not write to XMLStreamWriter.
at
org.apache.cxf.interceptor.StaxOutInterceptor$StaxOutEndingInterceptor.handleMessage(StaxOutInterceptor.java:173)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243)
at
org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:218)
at
org.mule.transport.cxf.CxfServiceComponent$1.write(CxfServiceComponent.java:273)
at
org.mule.transport.http.HttpServerConnection.writeResponse(HttpServerConnection.java:315)
at
org.mule.transport.http.HttpMessageReceiver$HttpWorker.run(HttpMessageReceiver.java:191)
at org.mule.work.WorkerContext.run(WorkerContext.java:310)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Thread.java:619)
Caused by: javax.xml.stream.XMLStreamException: Trying to write
END_DOCUMENT when document has no root (ie. trying to output empty
document).
at
com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1473)
at
com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1502)
at
com.ctc.wstx.sw.BaseStreamWriter.finishDocument(BaseStreamWriter.java:1663)
at
com.ctc.wstx.sw.BaseStreamWriter.writeEndDocument(BaseStreamWriter.java:585)
at
org.apache.cxf.interceptor.StaxOutInterceptor$StaxOutEndingInterceptor.handleMessage(StaxOutInterceptor.java:163)
... 9 more
I have attached a copy of the console log, an export of the Mule project
and an example soap request. The service I have switched over to use the
cxf:inbound-endpoint wsdlLocation attribute is called
WHS_LottoWagerStub-v1 - the endpoint address is
http://localhost:8888/whs/LottoWager-v1.
Let me know if you require any further details.
The problem has the same cause that the original
MULE-5030issue, which I think is a bug in CXF.The root of the problem is in SoapBindingFactory.initializeMessage() method. There CXF
creates a MessageInfo and sets the different message parts inside a list. Each part has an index,
which is the same than its position in the list. Then CXF removes the "headers" parts of the list but
it does not updates the index of the remaining parts. In this case, removes the first part (index 0)
but it does not updates the index of the second part (from 1 to 0).
The problem is manifested inside AbstractOutDatabindingInterceptor.writeParts method:
The problem is in the call to objs.hasValue(part):
This call return false because key.getIndex() = 1 and size =1. (key.getIndex() should be 0)
I will try to find a workaround for this problem, but I think the right fix should be in CXF,
which should update the part's index everytime it removes a part from the list.
MULE-5030issue, which I think is a bug in CXF. The root of the problem is in SoapBindingFactory.initializeMessage() method. There CXF creates a MessageInfo and sets the different message parts inside a list. Each part has an index, which is the same than its position in the list. Then CXF removes the "headers" parts of the list but it does not updates the index of the remaining parts. In this case, removes the first part (index 0) but it does not updates the index of the second part (from 1 to 0). The problem is manifested inside AbstractOutDatabindingInterceptor.writeParts method: