Pierre,

The WSI-Basic Profile specifically states that in RPC/Literal, the part 
accessor elements are ALWAYS to be unqualified.  This is per WSI-BP 
spec.   Basically, in RPC/Literal, the "wrapper" element (operationName) 
is qualified, the part accessor elements are unqualified, and the 
subelements of the parts are controlled by the schema.


>         <SOAPSDK4:GetAnswers xmlns:SOAPSDK4="http://annuaire.ciss.lu";>
>             <SOAPSDK4:questions
> SOAPSDK3:arrayType="SOAPSDK1:string[5]" SOAPSDK3:offset="[1]"
> SOAPSDK2:type="SOAPSDK3:Array"> <item>What?</item>

This looks like the VBA client is generating a RPC/Encoded message, not 
an RPC literal.  The SOAPSDK3:arrayType attribute is the key.   That 
would only be there for an Encoded message.   CXF doesn't support 
RPC/Encoded.

Dan



On Monday 14 April 2008, pierre post wrote:
> Hi all,
>
> I have an interoperability problem when calling an Apache CXF Web
> service (CXF version is 2.0.4) running under Apache Tomcat 6 from a
> VBA client program using MS Office 2003 Web Services Toolkit 2.03.
> When sending a request from the VBA client to the server, the response
> fails with the fault "Found element {http://annuaire.ciss.lu}questions
> but could not find matching RPC/Literal part". If I'm correct, the VBA
> client sends the request using qualified namespace for element
> "questions" but CXF expects an unqualified namespace. Due to technical
> constraints, I have to use RPC/Literal encoding and cannot switch to
> e.g. Document/Literal.
>
> This is my web service:
>
> package lu.ciss.annuaire.services;
>
> @WebService(name="SimpleServiceName",
> targetNamespace="http://annuaire.ciss.lu";)
> @SOAPBinding(style=Style.RPC)
> public interface SimpleService {
>     @WebMethod(operationName="GetAnswers")
>     @WebResult(name="answer")
>     public String getAnswers(@WebParam(name="questions") String[]
> questions);
> }
>
> The VBA client sends the following request:
>
> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> <SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema";
>     xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance";
>     xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/";
>     xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";>
>     <SOAP-ENV:Body>
>         <SOAPSDK4:GetAnswers xmlns:SOAPSDK4="http://annuaire.ciss.lu";>
>             <SOAPSDK4:questions
> SOAPSDK3:arrayType="SOAPSDK1:string[5]" SOAPSDK3:offset="[1]"
> SOAPSDK2:type="SOAPSDK3:Array"> <item>What?</item>
>                 <item>Why?</item>
>                 <item>Where?</item>
>                 <item>Who?</item>
>                 <item>When?</item>
>             </SOAPSDK4:questions>
>         </SOAPSDK4:GetAnswers>
>     </SOAP-ENV:Body>
> </SOAP-ENV:Envelope>
>
> As you can see the "questions" parameter is qualified. I know of the
> @XmlSchema annotation that you can place in the packge-info.java, but
> I don't know how to set the elementFormDefault to "qualified" for the
> namespace "http://jaxb.dev.java.net/array";. Moreover the problem
> remains the same when using only simple types (e.g. integers or
> strings) instead of an array: the elements describing the parameters
> are always qualified. Here is an extract of the WSDL:
>
> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> <wsdl:definitions xmlns:ns1="http://annuaire.ciss.lu";
>     xmlns:ns2="http://jaxb.dev.java.net/array";
>     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
>     xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> name="SimpleServiceName" targetNamespace="http://annuaire.ciss.lu";>
>     <wsdl:types>
>         <xs:schema xmlns="http://jaxb.dev.java.net/array";
>             xmlns:xs="http://www.w3.org/2001/XMLSchema";
>             attributeFormDefault="unqualified"
> elementFormDefault="unqualified"
>             targetNamespace="http://jaxb.dev.java.net/array";>
>             <xs:complexType final="#all" name="stringArray">
>                 <xs:sequence>
>                     <xs:element maxOccurs="unbounded" minOccurs="0"
>                         name="item" nillable="true" type="xs:string"
> /> </xs:sequence>
>             </xs:complexType>
>         </xs:schema>
>     </wsdl:types>
>     <wsdl:message name="GetAnswers">
>         <wsdl:part name="questions"
> type="ns2:stringArray"></wsdl:part> </wsdl:message>
>     <wsdl:message name="GetAnswersResponse">
>         <wsdl:part name="answer" type="xsd:string"></wsdl:part>
>     </wsdl:message>
>     <wsdl:portType name="SimpleServiceName">
>         <wsdl:operation name="GetAnswers">
>             <wsdl:input message="ns1:GetAnswers" name="GetAnswers">
>             </wsdl:input>
>             <wsdl:output message="ns1:GetAnswersResponse"
>                 name="GetAnswersResponse">
>             </wsdl:output>
>         </wsdl:operation>
>     </wsdl:portType>
> </wsdl:definitions>
>
> Can anyone confirm that the problem originates from the fact that
> elementFormDefault is set to "unqualified" and setting it to
> "qualified" could solve the problem? If so, how is it possible to
> instruct CXF in general that parameter elements are always qualified?
>
> Moreover, perhaps someone uses CXF with the MS Web services toolkit
> and can share his experiences with me? Unfortunately, the toolkit
> seems quite buggy ... :-(
>
> Thank you very much for any comments.
>
> Best regards,
> Pierre



-- 
J. Daniel Kulp
Principal Engineer, IONA
[EMAIL PROTECTED]
http://www.dankulp.com/blog

Reply via email to