+1 :-)
And some time I might fix a bug in AXIS myself. :-)
Yakulis, Ross (Ross) wrote:
Thank you for the info.
The WSDL I attached was generated by Axis. It seems to me (and I could be wrong) that one should not have to mess with WSDL files. WSDL is basically meant to be4 generated by programs and consumed by programs. For Web Services to really gain broad adoption, the "tools" (Java2WSDL and WSDL2Java) should do the right thing and generate proper WSDL files, so that developers wanting to use Web sesrvices need only concern themselves with the actual implemntation of the service. Isn't that the real concept that Web Services is trying to present?
Ross
-----Original Message----- From: Anne Thomas Manes [mailto:[EMAIL PROTECTED] Sent: Friday, August 08, 2003 5:07 AM To: [EMAIL PROTECTED] Subject: Re: Is this a bug?
According to the SOAP spec, Section 4.3: 1. A body entry is identified by its fully qualified element name, which consists of the namespace URI and the local name.
Regardless of whether or not you are using doc/literal or rpc/encoded, the QName of the env:body entry should be unique, and therefore Axis should be able to determine what to do based on this QName -- even if it isn't a method name.
In RPC and WRAPPED styles, this QName is the operation name. In DOCUMENT and MESSSAGE styles, this QName is the name of the element specified in the input message <part> definition.
Your WSDL messages don't distinguish between the two operations (both send a message with a QName of {urn:avaya.test.Doit}in0.) I recommend that you redesign your WSDL so that your input element names are distinct (e.g., "add" and "subtract" rather than "in0").
Note that you shouldn't specify a namespace attribute on the <wsdlsoap:body> definitions when using doc/literal. Axis will, by default, use the targetNamespace defined in the <schema> definition (which is where you define your input element). The <wsdlsoap:body> namespace attribute overrides the default.
I'm also assuming that getString returns a normal string, so I've changed the type to "xsd:string".
Here are my suggested changes:
------------------WSDL------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="urn:avaya.test.Doit" xmlns:impl="urn:avaya.test.Doit" xmlns:intf="urn:avaya.test.Doit" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:avaya.test.Doit"> <element name="add" type="xsd:int"/> <element name="addReturn" type="xsd:int"/> <element name="getStringReturn" type="xsd:string"/> <element name="subtract" type="xsd:int"/> <element name="subtractReturn" type="xsd:int"/> </schema> </wsdl:types> <wsdl:message name="subtractResponse"> <wsdl:part name="subtractReturn" element="impl:subtractReturn"/> </wsdl:message> <wsdl:message name="addRequest"> <wsdl:part name="add" element="impl:add"/> </wsdl:message> <wsdl:message name="subtractRequest"> <wsdl:part name="subtract" element="impl:subtract"/> </wsdl:message> <wsdl:message name="getStringRequest"> </wsdl:message> <wsdl:message name="getStringResponse"> <wsdl:part name="getStringReturn" element="impl:getStringReturn"/> </wsdl:message> <wsdl:message name="addResponse"> <wsdl:part name="addReturn" element="impl:addReturn"/> </wsdl:message> <wsdl:portType name="Doit"> <wsdl:operation name="add"> <wsdl:input name="addRequest" message="impl:addRequest"/> <wsdl:output name="addResponse" message="impl:addResponse"/> </wsdl:operation> <wsdl:operation name="getString"> <wsdl:input name="getStringRequest" message="impl:getStringRequest"/> <wsdl:output name="getStringResponse" message="impl:getStringResponse"/> </wsdl:operation> <wsdl:operation name="subtract"> <wsdl:input name="subtractRequest" message="impl:subtractRequest"/> <wsdl:output name="subtractResponse" message="impl:subtractResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DoitSoapBinding" type="impl:Doit"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="add"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="addRequest"> <wsdlsoap:body use="literal" /> </wsdl:input> <wsdl:output name="addResponse"> <wsdlsoap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="getString"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getStringRequest"> <wsdlsoap:body use="literal" /> </wsdl:input> <wsdl:output name="getStringResponse"> <wsdlsoap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="subtract"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="subtractRequest"> <wsdlsoap:body use="literal" /> </wsdl:input> <wsdl:output name="subtractResponse"> <wsdlsoap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="DoitService"> <wsdl:port name="Doit" binding="impl:DoitSoapBinding"> <wsdlsoap:address location="http://localhost:8080/Doit"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
----- Original Message ----- From: "Sanjay Krishnamurthi" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Thursday, August 07, 2003 6:30 PM Subject: Re: Is this a bug?
The issue here is that DOC/Lit does not carry method name in the SOAP body whereas SOAP/RPC does. As a result AXIS doesn't know how to dispatch the method and my guess is that it will work correctly as long as you don't have two methods that take the same parameters. You could get AXIS to use SOAPAction for doing the dispatch but keep in mind that use of SOAPAction for dispatching is not a "standard". It is meant to be a "hint".
As mentioned by others in various threads, for DOC/Lit I would recommend WSDL as the starting point and design it so that reqest SOAP body contains an <addRequest> document. (You would have to define a corresponding complex type in your WSDL)
Sanjay
--- Jeff Greif <[EMAIL PROTECTED]> wrote:
I think that when you use doc/lit operations, you must provide a each with a distinct SoapAction in the bindings, e.g.
wsdlsoap:soapAction="http://mycompany.com/mySubtract"
.
This might not be necessary if the Wrapped style is used, but better to be safe.
Jeff ----- Original Message ----- From: "Yakulis, Ross (Ross)" <[EMAIL PROTECTED]> To: "Axis User (E-mail)" <[EMAIL PROTECTED]> Sent: Thursday, August 07, 2003 2:45 PM Subject: Is this a bug?
Given below ( the interface, the client, the generated WSDL and the SOAP messages generated). When I use the generated stubs, methods with the same signature ( int add( int ) and int subtract( int ) ) are not distinguished on the server side. What happens is that add gets called when subtract should. This seems like a bug? Things work fine if I use RPC Encoded though. I am using Axis 1.1 release build.
Ross
------------ Intergace ------------------------ public interface Doit { public int add( int value ); public int subtract( int value ); public String getString(); } ------------- Client ---------------------------------------- DoitServiceLocator locator = new DoitServiceLocator(); Doit doit = locator.getDoit(new URL("http://localhost:6060/axis/services/Doit")); org.apache.axis.client.Stub stub = (Stub) doit; stub.setTimeout(45000);//in milliseconds stub.setMaintainSession(true); // Invoke Service int result = doit.add(5); result = doit.subtract(2); String str = doit.getString(); ------------ Java2WSDL -------------------------------------------- java -org.apache.axis.wsdl.Java2WSDL -oC:\eclipse\runtime-workspace\Doit/ws dl/doit.wsdl -lhttp://localhost:8080/doit -T1.2 -yDocument -uLiteral -nurn:N S.doit Doit ------------ WSDL2Java -------------------------------------------- java org.apache.axis.wsdl.WSDL2Java -T1.2 -O45 -dSession -s -Sfalse -px.y -oC:\e clipse\runtime-workspace\doit/. C:/eclipse/runtime-workspace/Doit/wsdl/doit.wsdl
------------------WSDL-------------------------------------------
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="urn:avaya.test.Doit" xmlns:impl="urn:avaya.test.Doit" xmlns:intf="urn:avaya.test.Doit" xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:avaya.test.Doit"> <element name="in0" type="xsd:int"/> <element name="addReturn" type="xsd:int"/> <element name="getStringReturn" type="soapenc:string"/> <element name="in0" type="xsd:int"/> <element name="subtractReturn" type="xsd:int"/> </schema> </wsdl:types> <wsdl:message name="subtractResponse"> <wsdl:part name="subtractReturn" element="impl:subtractReturn"/> </wsdl:message> <wsdl:message name="addRequest"> <wsdl:part name="in0" element="impl:in0"/> </wsdl:message> <wsdl:message name="subtractRequest"> <wsdl:part name="in0" element="impl:in0"/> </wsdl:message> <wsdl:message name="getStringRequest"> </wsdl:message> <wsdl:message name="getStringResponse"> <wsdl:part name="getStringReturn" element="impl:getStringReturn"/> </wsdl:message> <wsdl:message name="addResponse"> <wsdl:part name="addReturn" element="impl:addReturn"/> </wsdl:message> <wsdl:portType name="Doit"> <wsdl:operation name="add" parameterOrder="in0"> <wsdl:input name="addRequest" message="impl:addRequest"/> <wsdl:output name="addResponse" message="impl:addResponse"/> </wsdl:operation> <wsdl:operation name="getString"> <wsdl:input name="getStringRequest" message="impl:getStringRequest"/> <wsdl:output name="getStringResponse" message="impl:getStringResponse"/> </wsdl:operation> <wsdl:operation name="subtract" parameterOrder="in0"> <wsdl:input name="subtractRequest" message="impl:subtractRequest"/> <wsdl:output name="subtractResponse" message="impl:subtractResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DoitSoapBinding" type="impl:Doit"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="add"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="addRequest"> <wsdlsoap:body use="literal" namespace="urn:avaya.test.Doit"/> </wsdl:input> <wsdl:output name="addResponse"> <wsdlsoap:body use="literal" namespace="urn:avaya.test.Doit"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getString"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="getStringRequest"> <wsdlsoap:body use="literal" namespace="urn:avaya.test.Doit"/> </wsdl:input> <wsdl:output name="getStringResponse"> <wsdlsoap:body use="literal" namespace="urn:avaya.test.Doit"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="subtract"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="subtractRequest"> <wsdlsoap:body use="literal" namespace="urn:avaya.test.Doit"/> </wsdl:input> <wsdl:output name="subtractResponse"> <wsdlsoap:body use="literal" namespace="urn:avaya.test.Doit"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="DoitService"> <wsdl:port name="Doit" binding="impl:DoitSoapBinding"> <wsdlsoap:address location="http://localhost:8080/Doit"/> </wsdl:port> </wsdl:service> </wsdl:definitions> ------------------------------------------------- SOAP MESSAGES
(add request ) POST /axis/services/Doit HTTP/1.0 Content-Type: text/xml; charset=utf-8 Accept: application/soap+xml, application/dime, multipart/related, text/* User-Agent: Axis/1.1 Host: localhost Cache-Control: no-cache Pragma: no-cache SOAPAction: "" Content-Length: 329 <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body> <in0 xsi:type="xsd:int" xmlns="urn:avaya.test.Doit">5</in0> </soapenv:Body> </soapenv:Envelope>
(subtract request)
=== message truncated ===
__________________________________ Do you Yahoo!? Yahoo! SiteBuilder - Free, easy-to-use web site design software http://sitebuilder.yahoo.com