Hi Tim,
The "wrapped" style indicates a particular style of doing document/literal that
emulates RPC. This sounds a bit strange, but the best example of this is Microsoft
.NET web services. For document style, each message part is an element in the
request. For a wrapped style service, there is only a single message part, and its
name is "parameters". This part is defined to be an element, who's name is the same
as the operation name. This element then contains the parameters to the operation;
the parameters are wrapped in an element.
Here is a .NET Hello World WSDL:
<s:element name="HelloWorld">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="message" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="HelloWorldResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<message name="HelloWorldSoapIn">
<part name="parameters" element="s0:HelloWorld" />
</message>
<message name="HelloWorldSoapOut">
<part name="parameters" element="s0:HelloWorldResponse" />
</message>
Here is what the SOAP request body looks like for this:
<soap:Body>
<HelloWorld xmlns="http://tempuri.org/">
<message>string</message>
</HelloWorld>
</soap:Body>
Contrast this to what Axis would generate for the same hello world service using
rpc/encoded:
<message name="message" type="xsd:string">
<message name="HelloWorldResult" type="xsd:string">
The WSDL2Java tool recognizes this style of WSDL (in specific, by seeing a
document/literal operation, with a single message part, named 'parameters') and goes
in to wrapped mode. This causes the stubs generated to 'peel back' a layer in the
Schema types, and use the elements in the complextType (in our example,
HelloWorldSoapIn) as the parameters to the generated stub function. It also sets the
style to "wrapped" in the Call object.
So what does Axis do when the document style is set to "wrapped"? It treats the
operation as an RPC operation, but it sends document style, literal encoded XML. The
net effect is pretty simple: first we turn of multirefs and xsi types. Then we treat
each of the parameters specified in the JAX-RPC Call object just like we would for RPC
style, and we wrap the parameters in an element with a QName the same as the operation
name. This is OK, because the element specified in the WSDL has the SAME name as the
operation (by definition).
Why do we go through this? Because ALL .NET services are represented in WSDL by
default in this 'wrapped' manner, so left to default behavior, Axis would generate
stub code that would always have a single input JavaBean (in our example,
HelloWorldSoapIn) and a single return value JavaBean (HelloWorldSoapOut).
So instead of this:
String HelloWorld(String message)
you would get this:
HelloWorldSoapOut HelloWorld(HelloWorldSoapIn parameters)
Which isn't very friendly.
Hope this helps clarify things a bit. On rereading your original note, I realize you
only asked about when WSDL2Java. But I hope the extra info helps too.
--
Tom Jordahl
Macromedia
-----Original Message-----
From: Tim Blake [mailto:[EMAIL PROTECTED]]
Sent: Wednesday, April 03, 2002 7:35 AM
To: [EMAIL PROTECTED]
Subject: Wrapped vs. Document
Hi,
Could someone explain the criteria used to decide whether a service is "wrapped" or
"document" during the WSDL2Java process? I've had a look through the source code, but
couldn't find the pertinent information.
Many thanks,
Tim