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