The problem was actually in our implementation in that we were adding the wrong parameter type(s) to the params list.
The document at http://camel.apache.org/cxf.html (paragraph 'How to prepare the message for the camel-cxf endpoint in POJO data format') says: "First you need to specify the operation name in the message header, then add the method parameters to a list, and initialize the message with this parameter list." Actually the camel-cxf client in POJO mode expects the sequence of elements that constitutes the wsdl parameter (in our case not the singleMms element itself, but its contents, unwrapped). 2009/12/8 Max Ferrari <[email protected]>: > Hi Willem, > on the cxf endpoint we use http as transport. > > We're working in POJO mode so we're following > http://camel.apache.org/cxf.html paragraph "How to prepare the message > for the camel-cxf endpoint in POJO data format": so we're > - creating an object of type SingleMms (that's the param type > required by the operation), > - populate it, > - marshal it and > - put it onto the params list that's used to initialize the message > body (I've added a sample in my original message). > > We've tried also by adding / removing our 'callerIdentity' cxf header > from the exchange to see if that made any difference, but it didn't. > > Thanks > > Max > > 2009/12/8 Willem Jiang <[email protected]>: >> 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 >>> >> >> > -- Max
