You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Jeremy Nix <Je...@sfsltd.com> on 2005/04/11 21:42:31 UTC

Axis 1.2rc3 Web service executing incorrect method call.

I haven't been able to figure out exactly why its happening, but when my
client application tries to make a web service call, the web service
actually executes the wrong service call.  I've downloaded the source
and followed the execution of the request and the call is correct until
it enters RPCProvider.processMessage().  In this method, the method
(operation) is changed to a different method (operation).  To what I can
tell, Axis is having issues with the fact that my 1st parameter to my
method is a RPCElement and the 2nd parameter to my method is a
SOAPBodyElement.  Honestly, I could not determine how Axis classified
these parameters as RPCElements vs a SOAPBodyElement, but that is
besides the point.  The 1st element, because it is an RPCElement is
therefore considered the body of the method (the parameters), and then
the operation gets changed due to the drop of the 2nd parameter.  See
the latest RPCProvider.processMessage() to get a full understanding.

Anyways, has anyone else came across this?  Were you able to find a
workaround, or possibly the WSDL is incorrect.

Here's my WSDL:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://abstractor.webservices.sfsltd.com"
xmlns:xsd1="http://abstractor.webservices.sfsltd.com"
targetNamespace="http://abstractor.webservices.sfsltd.com"
name="Abstractor">
 <wsdl:types>
   <xs:schema
targetNamespace="http://abstractor.webservices.sfsltd.com">
  <xs:include schemaLocation="AbstractorTypes.xsd"/>
   </xs:schema>
 </wsdl:types>
 <wsdl:message name="MessageGetTitleSearchIn">
  <wsdl:part name="authentication" element="xsd1:Authentication"/>
 </wsdl:message>
 <wsdl:message name="MessageGetTitleSearchOut">
  <wsdl:part name="arg1" element="xsd1:TitleSearch"/>
 </wsdl:message>
 <wsdl:message name="MessageConfirmTitleSearchIn">
  <wsdl:part name="authentication" element="xsd1:Authentication"/>
  <wsdl:part name="confirmation" element="xsd1:Confirmation"/>
 </wsdl:message>
 <wsdl:portType name="AbstractorSoapPort">
  <wsdl:operation name="getTitleSearch">
   <wsdl:input message="tns:MessageGetTitleSearchIn"/>
   <wsdl:output message="tns:MessageGetTitleSearchOut"/>
  </wsdl:operation>
  <wsdl:operation name="confirmTitleSearch">
   <wsdl:input message="tns:MessageConfirmTitleSearchIn"/>
  </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="AbstractorBinding" type="tns:AbstractorSoapPort">
  <soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
  <wsdl:operation name="getTitleSearch">
   <soap:operation soapAction="getTitleSearch"/>
   <wsdl:input>
    <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://abstractor.webservices.sfsltd.com" use="literal"/>
   </wsdl:input>
   <wsdl:output>
    <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://abstractor.webservices.sfsltd.com" use="literal"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="confirmTitleSearch">
   <soap:operation soapAction="confirmTitleSearch"/>
   <wsdl:input>
    <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://abstractor.webservices.sfsltd.com" use="literal"/>
   </wsdl:input>
   <wsdl:output>
    <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://abstractor.webservices.sfsltd.com" use="literal"/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="Abstractor">
  <wsdl:port name="Abstractor" binding="tns:AbstractorBinding">
   <soap:address
location="http://localhost/webservices/services/Abstractor"/>
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions>

_______________________
Jeremy Nix
Senior Application Developer
Southwest Financial Services, LTD.
(513) 621-6699 x1158
www.sfsltd.com



Re: Axis 1.2rc3 Web service executing incorrect method call.

Posted by Anne Thomas Manes <at...@gmail.com>.
Jeremy,

Axis is working the way it was designed to. It determines which method
to invoke based on the first child element within the SOAP Body, and
it ignores any additional elements in the SOAP Body. When using RPC
style, the first child element is a generated wrapper element the has
the same name as the operation method. When using Document style, the
first child element is the element referenced in the first part
defined in your message description. You have defined two input
messages that contain the same element (<xsd1:Authentication>), so
both requests get dispatched to the same method (getTitleSearch).

Your WSDL has errors in it. You are mixing document and rpc styles. I
assume that you want to use document style. If so, you must remove the
encodingStyle and namespace attributes from your <soap:body>
definitions. The <soap:body> elements should be defined as:

<soap:body use="literal"/>

You also must have at most one part in your message definitions. Your
MessageConfirmTitleSearchIn message should refer to an element that is
defined as a sequence of the Authentication and Confirmation elements.

Here's an updated WSDL:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://abstractor.webservices.sfsltd.com"
xmlns:xsd1="http://abstractor.webservices.sfsltd.com"
targetNamespace="http://abstractor.webservices.sfsltd.com"
name="Abstractor">

 <wsdl:types>
  <xs:schema targetNamespace="http://abstractor.webservices.sfsltd.com">
   <xs:include schemaLocation="AbstractorTypes.xsd"/>
   <xs:element name="confirmTitleSearch">
     <xs:complexType>
      <xs:sequence>
        <xs:element ref="xsd1:Authentication"/>
        <xs:element ref="xsd1:Confirmation"/>
      </xs:sequence>
     </xs:complexType>
   </xs:element>
  </xs:schema>
 </wsdl:types>
 <wsdl:message name="MessageGetTitleSearchIn">
  <wsdl:part name="authentication" element="xsd1:Authentication"/>
 </wsdl:message>
 <wsdl:message name="MessageGetTitleSearchOut">
  <wsdl:part name="arg1" element="xsd1:TitleSearch"/>
 </wsdl:message>
 <wsdl:message name="MessageConfirmTitleSearchIn">
  <wsdl:part name="parameters" element="xsd1:confirmTitleSearch"/>
 </wsdl:message>
 <wsdl:portType name="AbstractorSoapPort">
  <wsdl:operation name="getTitleSearch">
   <wsdl:input message="tns:MessageGetTitleSearchIn"/>
   <wsdl:output message="tns:MessageGetTitleSearchOut"/>
  </wsdl:operation>
  <wsdl:operation name="confirmTitleSearch">
   <wsdl:input message="tns:MessageConfirmTitleSearchIn"/>
  </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="AbstractorBinding" type="tns:AbstractorSoapPort">
  <soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
  <wsdl:operation name="getTitleSearch">
   <soap:operation soapAction="getTitleSearch"/>
   <wsdl:input>
    <soap:body use="literal"/>
   </wsdl:input>
   <wsdl:output>
    <soap:body use="literal"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="confirmTitleSearch">
   <soap:operation soapAction="confirmTitleSearch"/>
   <wsdl:input>
    <soap:body use="literal"/>
   </wsdl:input>
   <wsdl:output>
    <soap:body use="literal"/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="Abstractor">
  <wsdl:port name="Abstractor" binding="tns:AbstractorBinding">
   <soap:address location="http://localhost/webservices/services/Abstractor"/>
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions> 

- Anne

On Apr 11, 2005 3:42 PM, Jeremy Nix <Je...@sfsltd.com> wrote:
>  
> 
> I haven't been able to figure out exactly why its happening, but when my
> client application tries to make a web service call, the web service
> actually executes the wrong service call.  I've downloaded the source and
> followed the execution of the request and the call is correct until it
> enters RPCProvider.processMessage().  In this method, the method (operation)
> is changed to a different method (operation).  To what I can tell, Axis is
> having issues with the fact that my 1st parameter to my method is a
> RPCElement and the 2nd parameter to my method is a SOAPBodyElement. 
> Honestly, I could not determine how Axis classified these parameters as
> RPCElements vs a SOAPBodyElement, but that is besides the point.  The 1st
> element, because it is an RPCElement is therefore considered the body of the
> method (the parameters), and then the operation gets changed due to the drop
> of the 2nd parameter.  See the latest RPCProvider.processMessage() to get a
> full understanding. 
> 
> Anyways, has anyone else came across this?  Were you able to find a
> workaround, or possibly the WSDL is incorrect. 
> 
> Here's my WSDL: 
> <?xml version="1.0" encoding="UTF-8"?> 
> <wsdl:definitions
> xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
> xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
> xmlns:xs="http://www.w3.org/2001/XMLSchema"
> xmlns:tns="http://abstractor.webservices.sfsltd.com"
> xmlns:xsd1="http://abstractor.webservices.sfsltd.com"
> targetNamespace="http://abstractor.webservices.sfsltd.com"
> name="Abstractor"> 
> 
>  <wsdl:types> 
>    <xs:schema
> targetNamespace="http://abstractor.webservices.sfsltd.com">
>   <xs:include schemaLocation="AbstractorTypes.xsd"/> 
>    </xs:schema> 
>  </wsdl:types> 
>  <wsdl:message name="MessageGetTitleSearchIn"> 
>   <wsdl:part name="authentication" element="xsd1:Authentication"/> 
>  </wsdl:message> 
>  <wsdl:message name="MessageGetTitleSearchOut"> 
>   <wsdl:part name="arg1" element="xsd1:TitleSearch"/> 
>  </wsdl:message> 
>  <wsdl:message name="MessageConfirmTitleSearchIn"> 
>   <wsdl:part name="authentication" element="xsd1:Authentication"/> 
>   <wsdl:part name="confirmation" element="xsd1:Confirmation"/> 
>  </wsdl:message> 
>  <wsdl:portType name="AbstractorSoapPort"> 
>   <wsdl:operation name="getTitleSearch"> 
>    <wsdl:input message="tns:MessageGetTitleSearchIn"/> 
>    <wsdl:output message="tns:MessageGetTitleSearchOut"/> 
>   </wsdl:operation> 
>   <wsdl:operation name="confirmTitleSearch"> 
>    <wsdl:input message="tns:MessageConfirmTitleSearchIn"/> 
>   </wsdl:operation> 
>  </wsdl:portType> 
>  <wsdl:binding name="AbstractorBinding" type="tns:AbstractorSoapPort"> 
>   <soap:binding style="document"
> transport="http://schemas.xmlsoap.org/soap/http"/> 
>   <wsdl:operation name="getTitleSearch"> 
>    <soap:operation soapAction="getTitleSearch"/> 
>    <wsdl:input> 
>     <soap:body
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> namespace="http://abstractor.webservices.sfsltd.com"
> use="literal"/> 
> 
>    </wsdl:input> 
>    <wsdl:output> 
>     <soap:body
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> namespace="http://abstractor.webservices.sfsltd.com"
> use="literal"/> 
> 
>    </wsdl:output> 
>   </wsdl:operation> 
>   <wsdl:operation name="confirmTitleSearch"> 
>    <soap:operation soapAction="confirmTitleSearch"/> 
>    <wsdl:input> 
>     <soap:body
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> namespace="http://abstractor.webservices.sfsltd.com"
> use="literal"/> 
> 
>    </wsdl:input> 
>    <wsdl:output> 
>     <soap:body
> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
> namespace="http://abstractor.webservices.sfsltd.com"
> use="literal"/> 
> 
>    </wsdl:output> 
>   </wsdl:operation> 
>  </wsdl:binding> 
>  <wsdl:service name="Abstractor"> 
>   <wsdl:port name="Abstractor"
> binding="tns:AbstractorBinding"> 
>    <soap:address
> location="http://localhost/webservices/services/Abstractor"/>
>   </wsdl:port> 
>  </wsdl:service> 
> </wsdl:definitions> 
> 
> _______________________ 
> Jeremy Nix 
> Senior Application Developer 
> Southwest Financial Services, LTD. 
> (513) 621-6699 x1158 
> www.sfsltd.com 
>