Do you use jms transport on the CXF endpoint?
I fixed an error (with the same error message) of camel-cxf recently,
which was caused by the CXF jms transport can't deal with exception
message rightly.
If not, can you tell me what kind of message do you send to CXF client ?
Willem
Max Ferrari wrote:
Hi list,
I have managed to reproduce on SMIX 4.0.0 vanilla (camel 1.6.0 and cxf
2.1.4) an issue that we are experiencing also on Fuse ESB 4.1.
In one of our bundles we have defined a CXF client with datamode set
to POJO and MTOM enabled.
Our customer's WSDL (see below) has an implicit header for
authentication (the header is defined in the wsdl:binding section but
not in the wsdl:portType).
We use the maven cxf-codegen-plugin to execute wsdl2java to generate
client sources.
The problem arises when - from one of our routes - we generate a
message and send it to the cxf client bean; before it even reaches the
server we get the following exception and then the exchange is routed
to the dead letter queue:
11:52:24,685 | WARN | nerContainer-973 | PhaseInterceptorChain |
org.apache.cxf.endpoint.ClientImpl 471 | Interceptor has thrown
exception, unwinding now
org.apache.cxf.interceptor.Fault: Index: 1, Size: 1
at
org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:119)
...
Caused by: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at
com.intersec.schema.mcms._3.SingleMms_WrapperTypeHelper1.createWrapperObject(Unknown
Source)
at
org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:103)
... 39 more
Of course the com.intersec package has to do with the cxf-generated client code.
Now, I've dug a bit but the only relevant result I could find is a cxf
issue with out-of-band headers that was fixed in cxf 2.0.3:
https://issues.apache.org/jira/browse/CXF-1129
Not sure if what I'm seeing in our route is our mistake, a new issue
with cxf or a regression, however I've tried with the workaround
suggested in that cxf Jira entry (running the wsdl2java with '-exsh
true'), unfortunately with no results (we get the same error).
Any pointers anyone?
Relevant excerpts of our source code:
// -----------------------------------------------------------------------CXF
client definition
<cxf:cxfEndpoint
id="cxfClientMTOM"
serviceClass="com.intersec.schema.mcms._3.MCMSPortType"
address="${cxfclient.serviceURI}">
<cxf:inInterceptors>
<ref bean="logInbound"/>
</cxf:inInterceptors>
<cxf:outInterceptors>
<ref bean="logOutbound"/>
<!-- <ref bean="JonasWSSOutInterceptor"/>-->
</cxf:outInterceptors>
<cxf:properties>
<entry key="dataFormat" value="POJO" />
<entry key="mtom-enabled" value="true" />
</cxf:properties>
</cxf:cxfEndpoint>
// -----------------------------------------------------------------------
sample WSDL
<?xml version="1.0"?>
<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://schema.intersec.com/mcms/3"
targetNamespace="http://schema.intersec.com/mcms/3"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
>
<wsdl:types>
<xsd:schema targetNamespace="http://schema.intersec.com/mcms/3">
<xsd:import namespace="http://www.w3.org/2005/05/xmlmime"
schemaLocation="xmime.xsd" />
<xsd:complexType name="attachmentArray">
<xsd:sequence>
<xsd:element name="attachment" type="tns:attachment"
minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="attachment">
<xsd:sequence>
<xsd:element minOccurs="0" name="fileName" type="xsd:string" />
<xsd:element minOccurs="0" name="binaryData"
type="xmime:base64Binary" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="singleMms">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="oadc" type="xsd:string"
minOccurs="1" maxOccurs="1"/>
<xsd:element name="msisdn_to" type="xsd:string"
minOccurs="1" maxOccurs="1"/>
<xsd:element name="subject" type="xsd:string"
minOccurs="1" maxOccurs="1"/>
<xsd:element name="smil"
type="xmime:base64Binary" xmime:expectedContentTypes="text/xml"
minOccurs="1" maxOccurs="1"/>
<xsd:element name="attachments"
type="tns:attachmentArray" minOccurs="1" maxOccurs="1"/>
<xsd:element name="allow_adaptations" type="xsd:boolean"
minOccurs="1" maxOccurs="1"/>
<xsd:element name="message_priority" type="xsd:int"
minOccurs="1" maxOccurs="1"/>
<xsd:element name="message_expiration" type="xsd:int"
minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="singleMmsResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="singleMmsReturn" type="xsd:boolean"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="callerIdentity">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="login" type="xsd:string" minOccurs="1"
maxOccurs="1" />
<xsd:element name="password" type="xsd:string"
minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="identityHeader">
<wsdl:part name="request_header" element="tns:callerIdentity"/>
</wsdl:message>
<wsdl:message name="singleMmsRequest">
<wsdl:part name="parameters" element="tns:singleMms"/>
</wsdl:message>
<wsdl:message name="singleMmsResponse">
<wsdl:part name="parameters" element="tns:singleMmsResponse"/>
</wsdl:message>
<wsdl:portType name="MCMSPortType">
<wsdl:operation name="singleMms">
<wsdl:input message="tns:singleMmsRequest" />
<wsdl:output message="tns:singleMmsResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="MCMSBinding" type="tns:MCMSPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="singleMms">
<soap:operation soapAction="" />
<wsdl:input>
<soap:header use="literal" part="request_header"
message="tns:identityHeader" />
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MCMS">
<wsdl:port name="MCMSPort" binding="tns:MCMSBinding">
<soap:address location="http://localhost:8000/soap/"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
// -----------------------------------------------------------------------Sample
route code
[...]
.process(new Processor() {
@Override
public void process(Exchange x) throws Exception {
SingleMms soapSingleMMS = new SingleMms();
// ... populate the mms fields ...
List<String> params = new LinkedList<String>();
JAXBContext mcmsJC = JAXBContext.newInstance("com.intersec.schema.mcms._3");
Marshaller ma = mcmsJC.createMarshaller();
StringWriter mcmsWriter = new StringWriter();
ma.marshal(soapSingleMMS, mcmsWriter);
// set in request
params.add(mcmsWriter.toString());
Map<String, Object> requestContext = new HashMap<String, Object>();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://localhost:9080");
// create & add caller identity header
CallerIdentity identity = new CallerIdentity();
identity.setLogin("dummy");
identity.setPassword("dummy");
List<Header> headers = new ArrayList<Header>();
Header identityHeader = new Header(new
QName("com.intersec.schema.mcms._3", "callerIdentity"), identity, new
JAXBDataBinding(CallerIdentity.class));
headers.add(identityHeader);
x.getOut().setHeader(Header.HEADER_LIST, headers);
x.getOut().setBody(params);
x.getOut().setHeader(Client.REQUEST_CONTEXT , requestContext);
x.getOut().setHeader(CxfConstants.OPERATION_NAME, "singleMms");
}
})
// web service request
.to("cxf:bean:" + getCxfEndpointId())
[...]
--
Max