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

Reply via email to