Sounds like Java2WSDL should concatenate the method name with the class
name when generating the QName of the element so that you would get two
types:
{Urn:Doit:add}in0
{Urn:Doit:subtract}in0
That shouldn't break rpc and should differentiate the elements enough so
that axis can determine the proper operation to dispatch to in the
doc/lit case. Someone from axis-dev want to comment?
mike
-----Original Message-----
From: Stuart Barlow [mailto:[EMAIL PROTECTED]
Sent: Friday, August 08, 2003 10:41 AM
To: [EMAIL PROTECTED]
Subject: Re: Is this a bug?
+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
>>
>
>
>