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 = > new 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 ----------------