Skip to main content
Summary Artix 5.6 Web Dispatch Message mode response header failure - Artix altering SOAP Message
Article Number 31424
Environment Artix 5.6 Java Runtime All Supported Operating Systems
Question/Problem Description

When using a server using a Provider implementation in conjunction with a WSDL that defines a SOAP header as part of its output, the contents out the SOAP body will be written as a SOAP header depending on the order of the parts defined in the output message.

Clarifying Information

If an output message is defined like this:

<message name="FooResponse">
<part name="FooResponseHeader" element="tns:FooResponseHeader"/>
<part name="FooResponse" element="tns:FooResponse"/>
</message>

and the SOAP binding operation is defined like this:

<operation name="Foo">
<soap:operation/>
<input>
<soap:header message="tns:FooRequest" part="FooRequestHeader" use="literal"/>
<soap:body parts="FooRequest" use="literal"/>
</input>
<output>
<soap:header message="tns:FooResponse" part="FooResponseHeader" use="literal"/>
<soap:body use="literal"/>
</output>
</operation>

because the FooResponseHeader is defined as the first part in the output message, Artix writes out the following message:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<FooResponseHeader xmlns:ns2="http://cxf.apache.org/soapheader/inband">FooResponseHeader</FooResponseHeader>
<ns2:FooResponse xmlns:ns2="http://cxf.apache.org/soapheader/inband">
<ns2:Return>Foo Response Body</ns2:Return>
</ns2:FooResponse></SOAP-ENV:Header>
<SOAP-ENV:Body/>
</SOAP-ENV:Envelope>

Note the element in bold should be in the SOAP Body and not the SOAP header.

Error Message org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging WARNING: Interceptor for {http://services.foo.com/header}SoapHeaderService#{http://services.foo.com/header}OperationName has thrown exception, unwinding now java.lang.IndexOutOfBoundsException: Index: 4, Size: 4 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at org.apache.cxf.message.MessageContentsList.get(MessageContentsList.java:79) at org.apache.cxf.jaxws.interceptors.HolderInInterceptor.handleMessage(HolderInInterceptor.java:69) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255) at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:785) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2375) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:2233) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:2076) at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:47) at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:188) at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:724) at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
Defect/Enhancement Number Bug# AI-536
Cause SoapOutInterceptor used the part index of the part defining the output header to look up the instance of that part in the MessageContentList contained in the Message. However, in the Provider use case, the MessageModeOutInterceptorInternal interceptor puts the contents of the SOAP body into the first slot of the MessageContentList. So in the case where the index of the SOAP header part is 0, the contents of the SOAP body get written out as a SOAP header.
Resolution Fixed in the latest patch to Artix 5.6
Workaround
Notes
Attachment
Created date: 26 April 2012
Last Modified: 13 February 2013
Last Published: 26 April 2012
First Published date: 26 April 2012

#Orbix
#KnowledgeDocs