Anne -

What is the correct behavior of AXIS supposed to be?

Since all the method request/response info is in the WSDL file, I thought you shouldn't need to duplicate any of that information in the WSDD file.  You would simply have the WSDD file point to the WSDL file.

On the other hand, WSDL2Java generates a gigantic WSDD file, duplicating all the information from the WSDL file.  That makes me think that you have to have that information in the WSDD.

Thanks,
Bill

Anne Thomas Manes wrote:
Even though there is a work-around, this is still a bug. When using
document/literal, Axis must generate a response message according to
the structure defined in the schema in the WSDL. It should generate
its own function return value only when using RPC style.

- Anne

On Fri, 07 Jan 2005 17:34:59 +0900, Bill Keese
<[EMAIL PROTECTED]> wrote:
  
Ah, I see.  Yes, you should be able to use document style or wrapped style,
and in document style you don't put the action name inside the soapBody.

I just looked at the AXIS code that serializes the response
(Emitter.getResponseMessage()).  It seems like, regardless of the WSDL file,
AXIS serializes your function return value as
   <XXXReturn>
       12345
   </XXXReturn>

where 12345 is the return value, and XXX is supposed to be the operation
name  (see the code "retName = oper.getName() + "Return";").  Although in
your case, it's getting confused about what the operation name is.  However,
you can override the name of that tag by writing the return information into
the WSDD file.  Something like this:

        <operation name="reverse" qname="operNS:reverse" 
                 xmlns:operNS="http://ws.moon.net/j2me05" 
                 returnQName="retNS:reverseResult" 
                 xmlns:retNS="http://ws.moon.net/j2me05" 
                 returnType="rtns:string" 
                 xmlns:rtns="http://www.w3.org/2001/XMLSchema" >
        <parameter qname="pns:in0" xmlns:pns="http://ws.moon.net/j2me05" 
                   type="tns:string"
xmlns:tns="http://www.w3.org/2001/XMLSchema"/>
      </operation>

According to my reading of Emitter.getResponseMessage() that should let you
control the name of the tag immediately below <soap:Body>.   Does that work?

Bill


Ephemeris Lappis wrote: 
Hello.
    
I don't think the problem comes from the request format. First,
  
similar
    
examples, all in document/literal style works fine with the same
  
client
    
(Wireless Toolkit) running against the SUN's JWSDK server. Then, i
  
suppose
    
that if the requests were not correct, the axis server should
  
respond with a
    
fault, and not serve them with an invalid response. Although
  
i'm not an
    
expert, i think the form you give is like a 'wrapped' style
  
request while
    
i'm trying to use the 'document' style...
I've tried the two
  
forms (original and the one you suggested) with a simple
    
HttpURLConnection,
  
and wile the first one always produce the successful
    
invalid response, the
  
modified one ends with an axis server fault response.
    
See bellow the test
  
code...
    
I'd really like an answer to my bug report from the axis
  
team...
    
Thanks anyway...

package my.tests;

import
  
java.io.BufferedReader;
    
import java.io.InputStreamReader;
import
  
java.io.PrintStream;
    
import java.net.HttpURLConnection;
import
  
java.net.URL;
    

public class Test1 {

 public static void main(final String[]
  
args) throws Exception {
    

 StringBuffer sb = new StringBuffer();
  
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>").append("\r\n");
sb.append("<soap:Envelope
    
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"").append("\r\n");

sb.append("xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"").append("\r\n");

sb.append("xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"").append
("\r\n");
  
sb.append("xmlns:tns=\"http://ws.moon.net/j2me05\">").append("\r\n");
sb.append("<soap:Body>").append("\r\n");
sb.append("<tns:in0>ABC</tns:in0>").append("\r\n");
sb.append("</soap:Body>").append("\r\n");
    
 sb.append("</soap:Envelope>");
  
call(sb);
    

 sb = new StringBuffer();
 sb.append("<?xml version=\"1.0\"
  
encoding=\"utf-8\"?>").append("\r\n");
sb.append("<soap:Envelope
    
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"").append("\r\n");

sb.append("xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"").append("\r\n");

sb.append("xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"").append
("\r\n");
  
sb.append("xmlns:tns=\"http://ws.moon.net/j2me05\">").append("\r\n");
sb.append("<soap:Body>").append("\r\n");
sb.append("<tns:reverse>").append("\r\n");
sb.append("<tns:in0>ABC</tns:in0>").append("\r\n");
sb.append("</tns:reverse>").append("\r\n");
sb.append("</soap:Body>").append("\r\n");
    
 sb.append("</soap:Envelope>");
  
call(sb);
    

 }

 static void call(final StringBuffer sb) throws Exception {

  
URL url =
""
    
URL("http://localhost:9999/j2me05ws-ejb/J2ME-05-WS/J2ME05WS");
  
HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestMethod("POST");
    
 http.setDoOutput(true);
  
http.setRequestProperty("Content-Type", "text/xml");
http.setRequestProperty("Content-Length", String.valueOf(sb.length()));
http.setRequestProperty("SOAPAction", "");
    
 PrintStream ps = new
  
PrintStream(http.getOutputStream());
    
 ps.print(sb);
 ps.flush();

  
BufferedReader reader = new
BufferedReader(new
    
InputStreamReader(http.getInputStream()));
 for (;;) {
  
String line = reader.readLine();
    
 if (line == null)
 break;
  
System.out.println(line);
    
 }

 http.disconnect();

 }

}




 
  
-----Message d'origine-----
    
De : Bill Keese
  
[mailto:[EMAIL PROTECTED]]
    
Envoyé : vendredi 7 janvier 2005 02:39
À
  
: [EMAIL PROTECTED]
    
Objet : Re: Document/Literal : bad part name in
  
axis server response
    


OK. I looked over your mail again and I saw a
  
problem. You are using
    
document/literal, right? For the request, you should
  
have the name of
    
the method within your soap body. And for the response, I'm
  
not sure
    
what is correct but I listed my hypothesis below. (I'm still
  
figuring
    
it out myself)

Here's the current request:

 
  
 <soap:Body>
    
 <tns:in0>ABC</tns:in0>
 </soap:Body>
 </soap:Envelope>

 You
  
are calling the method "reverse" with the parameter "in0",
    
right? I
think
  
the SOAP body should be:
    

<soap:Body>
 <reverse>
 <in0>ABC</in0>
  
</reverse>
    
</soap:Body>

(I'm not sure about the namespaces though)

Here's
  
the current response
    

 
  
 <soapenv:Body>
    
 <in0Return
  
xmlns="http://ws.moon.net/j2me05">CBA</in0Return>
</soapenv:Body></soapenv:Envelope>
    

 It thinks that in0 is the name of your
  
method, rather than the name of
    
the parameter to the method.

To setup the
  
request, you need a schema type with the same name as your
    
method:

<schema
  
xmlns="http://www.w3.org/2001/XMLSchema"
    
targetNamespace="http://ws.moon.net/j2me05"
elementFormDefault="qualified">
  
<complexType name="reverse">
    
 <element name="in0" type="xsd:string"/>
  
</complexType>
    
</schema>

Then you setup a message that just points to the
  
schema type
    
(it's useless but you have to put it in because that's the
  
way
    
WSDL works):

<wsdl:message name="reverseRequest">
 <wsdl:part
  
name="parameters" element="impl:reverse"/>
    
</wsdl:message>


I'm not sure
  
how to setup the WSDL with regard to responses.
    
If you look at
  
http://www.n2soft.net/Services/HNDCAP.asmx?wsdl
    
(or other links from
  
www.mindreef.com), you will see this:
    

<s:element name="PostScoreResponse">
  
<s:complexType>
    
 <s:sequence>
 <s:element minOccurs="1"
  
maxOccurs="1"
    
name="PostScoreResult" type="s:boolean"/>
 </s:sequence>
  
</s:complexType>
    
</s:element>

<wsdl:message name="PostScoreSoapOut">
  
<wsdl:part name="parameters"
element="tns:PostScoreResponse"/>
    
</wsdl:message>

(Again, the message just
  
points to the schema definition, where
    
the element name is methodName +
  
"Response".
    
I guess that this would produce a response like

<soap:Body>
  
<PostScoreResponse>
    
 <PostScoreResult>42</PostScoreResult>
  
</PostScoreResponse>
    
</soap:Body>

It seems like a lot of overhead for one
  
number but I've got a
    
feeling that the clients won't work unless you
  
structure it
    
like that. I'm still experimenting though.


Bill

Ephemeris
  
Lappis wrote:
    

 
  
Before i open a bug, i'd like to have the opinion of experts !
    
All my last
  
tests around document/literal style let me with
    
 troubles. To
 
  
start again with simple things, i have made a basic service to
    
 evaluate
  
the
    
 
  
primary interoperability with my J2ME client. This simple
    
 service provides
  
a
    
 
  
single operation that takes a string, reverses it and return it.
    
On the
  
client side, i work with the SUN Wireless toolkit that
    
 support the
 
  
JSR172 (web-service for J2ME). Using the axis wsdl i have
successfully
    
generated the j2me client stubs, and built my midlet to call
  
the web
    
service. At run time, the client reports an error in the
 server
  
response :
    
 
  
the name of the response part for the return value is not as
    
 defined in
  
the
    
 
  
wsdl descriptor. To be sure, i had made the test again putting the
tcp
    
monitor in the middle... and it seems the client is right !
The name of
  
the part in the wsdl is 'reverseReturn' and axis uses
    
'in0Return'...
Is it a
  
bug, or just another mis-interpretation of mine ?
    
Thanks to give your
  
opinion before i open an unnecessary bug report...
    


Here the java code
  
:
    

--- java interface ---
package net.moon.me.five.ws;

import
  
java.rmi.Remote;
    
import java.rmi.RemoteException;

public interface
  
StringTool extends Remote {
    

 public String reverse(String string) throws
  
RemoteException;
    

}
----------------------

I have successfully generated
  
the wsdl with the following ant script :
    

--- wsdl2java ant script
  
---
    
<property name="my.namespace" value="http://ws.moon.net/j2me05"
  
/>
    
<java2wsdl output="./wsdl/j2me05ws.wsdl"
  
className="net.moon.me.five.ws.StringTool"
    
 namespace="${my.namespace}"
  
porttypename="StringUtility"
    
 serviceportname="StringUtilityPort"
  
serviceelementname="J2ME05"
    
 style="DOCUMENT"
  
location="http://ws.moon.net/j2me05">
    
 <classpath>
 <pathelement
  
location="${my.services.compile-directory}" />
    
 <path
  
refid="my.axis.classpath" />
</classpath>
    
</java2wsdl>
----------------------------

The resulting WSDL,
  
with the expected part names !
    

--- WSDL ---
<?xml version="1.0"
  
encoding="UTF-8"?>
    
<wsdl:definitions
  
targetNamespace="http://ws.moon.net/j2me05"
    
xmlns:impl="http://ws.moon.net/j2me05"
xmlns:intf="http://ws.moon.net/j2me05"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<!--WSDL
  
created by Apache Axis version: 1.2RC2
    
Built on Nov 16, 2004 (12:19:44
  
EST)-->
    
<wsdl:types>
 <schema
  
xmlns="http://www.w3.org/2001/XMLSchema"
    
targetNamespace="http://ws.moon.net/j2me05"
  
elementFormDefault="qualified">
    
 
  
 <element name="in0" type="xsd:string"/>
    
 <element name="reverseReturn"
  
type="xsd:string"/>
    
 </schema>
</wsdl:types>

 <wsdl:message
  
name="reverseRequest">
    

 <wsdl:part name="in0" element="impl:in0"/>

  
</wsdl:message>
    

 <wsdl:message name="reverseResponse">

 <wsdl:part
  
name="reverseReturn" element="impl:reverseReturn"/>
    

 </wsdl:message>

  
<wsdl:portType name="StringUtility">
    

 <wsdl:operation name="reverse"
  
parameterOrder="in0">
    

 <wsdl:input name="reverseRequest"
  
message="impl:reverseRequest"/>
    
 
  
 <wsdl:output name="reverseResponse"
    
message="impl:reverseResponse"/>

  
</wsdl:operation>
    

 </wsdl:portType>

 <wsdl:binding
  
name="StringUtilityPortSoapBinding"
    
type="impl:StringUtility">

  
<wsdlsoap:binding
style="document"
    
transport="http://schemas.xmlsoap.org/soap/http"/>

  
<wsdl:operation name="reverse">
    

 <wsdlsoap:operation soapAction=""/>

  
<wsdl:input name="reverseRequest">
    

 <wsdlsoap:body use="literal"/>

  
</wsdl:input>
    

 <wsdl:output name="reverseResponse">

 <wsdlsoap:body
  
use="literal"/>
    

 </wsdl:output>

 </wsdl:operation>

 </wsdl:binding>

  
<wsdl:service name="J2ME05">
    

 <wsdl:port
  
name="StringUtilityPort"
    
binding="impl:StringUtilityPortSoapBinding">

  
<wsdlsoap:address location="http://ws.moon.net/j2me05"/>
    

 </wsdl:port>

  
</wsdl:service>
    

</wsdl:definitions>
-------------------------------------

And
  
now, the dumped http request and response :
    

--- request ---
POST
  
/j2me05ws-ejb/J2ME-05-WS/J2ME05WS HTTP/1.1
    
User-Agent: Profile/MIDP-1.0
  
Configuration/CLDC-1.0
    
Content-Language: en-US
Content-Type:
  
text/xml
    
SOAPAction: "
Content-Length: 315
Host: localhost

<?xml
  
version="1.0" encoding="utf-8"?>
    
 <soap:Envelope
  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://ws.moon.net/j2me05">
  
<soap:Body>
    
 <tns:in0>ABC</tns:in0>
 </soap:Body>
  
</soap:Envelope>
    
---------------

--- response ---
HTTP/1.1 200
  
OK
    
Set-Cookie: JSESSIONID=75C329A6CED0EE74D896E083043AFA0A;
  
Path=/j2me05ws-ejb
    
 
  
Content-Type: text/xml;charset=utf-8
    
Transfer-Encoding: chunked
Date: Tue,
  
21 Dec 2004 14:15:18 GMT
    
Server: Apache-Coyote/1.1

123
<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>
    
 <in0Return
  
xmlns="http://ws.moon.net/j2me05">CBA</in0Return>
</soapenv:Body></soapenv:Envelope>
    
0
----------------


  

Reply via email to