You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Wei Hsu <wh...@openharbor.com> on 2004/08/19 11:10:01 UTC

Declaring Arrays in Doc/Lit Wrapped Style

Hi all,

 

I have a question about the XML declaration for an array in doc/lit wrapped
style.  For a server side method with the following signature:

 

String test(String[] value)

 

I had been representing it with the following element:

 

<element name="test">

  <complexType>

    <sequence>

      <element minOccurs="0" maxOccurs="unbounded" name="value"
type="xsd:string" nillable="true"/>

   </sequence>

  </complexType>

</element>

 

This allows me to correctly generate a proxy that matches my original method
when I use WSDL2Java.  However, I recently checked out the WS-I Basic
Profile 1.0, and it gave the following example as the correct way to
represent soapenc:Array.

 

<!-start -->

<xsd:element name="MyArray1" type="tns:MyArray1Type"/>

<xsd:complexType name="MyArray1Type">

  <xsd:sequence>

   <xsd:element name="x" type="xsd:string" 

    minOccurs="0" maxOccurs="unbounded"/>

  </xsd:sequence>

</xsd:complexType>

<!-end -->

 

That would mean that for the same "test" method, I should actually be
declaring the "test" element as the following:

 

<element name="test">

  <complexType>

    <sequence>

      <element name="arr" type="tns:MyStringArray"/>

   </sequence>

  </complexType>

</element>

 

<complexType name="MyStringArray">

  <sequence>

    <element minOccurs="0" maxOccurs="unbounded" name="value"
type="xsd:string" nillable="true"/>

 </sequence>

</complexType>

 

However, when I try to use WSDL2Java on that, I end up with the following
signature:

 

String test(MyStringArray arr)

 

Where MyStringArray contains a String[] inside.  This makes sense, but it
sort of confuses me as to which direction is the "correct" one.  Is there
any harm using my current way of representing an array? I also found the
following article, which sort of validates my approach.  

 

http://searchwebservices.techtarget.com/ateQuestionNResponse/0,289625,sid26_
cid569769_tax294325,00.html
<http://searchwebservices.techtarget.com/ateQuestionNResponse/0,289625,sid26
_cid569769_tax294325,00.html> 

 

<exerpt>

As part of section 5.2.3 of the WS-I basic profile, there is an example
showing of the right way to encode an array. Basically, you just use
standard XSD "minOccurs" and "maxOccurs" on an element declaration to
represent an array. If you, in addition, want to define a specific reuseable
type for that array, you create a complex type containing a sequence
containing the repeating element.

</exerpt>

 

 

Any thoughts?

 

 

-Wei

 

 


RE: Declaring Arrays in Doc/Lit Wrapped Style

Posted by Anne Thomas Manes <an...@manes.net>.
Your original array definition is correct, and it conforms to the WS-I
recommendation. The only significant difference in your definition versus
the WS-I recommendation is that your array supports a null value in addition
to no occurrences. There's also the minor difference in that you did not
name your array type, but you don't need to do that unless you need to
reference the type separately from the element (e.g., if you were using
rpc/literal, or if you have multiple elements that have the same type).
 
To design your array just like the recommendation, you should define it like
this:
 
<element name="test" type="testType/>
<complexType name="testType">
    <sequence>
      <element minOccurs="0" maxOccurs="unbounded" name="value"
type="xsd:string" />
   </sequence>
</complexType>
 
If you want to support a null value, then define it like this:
 
<element name="test" type="testType/>
<complexType name="testType">
    <sequence>
      <element minOccurs="0" maxOccurs="unbounded" name="value"
type="xsd:string" nillable="true"/>
   </sequence>
</complexType>
 
Your interpretation of the WS-I recommendation is inaccurate - as you say -
it results in an extra level of nesting that you don't want.
 
You can stick with what you have unless you have a requirement to reference
the array type separate from the element. Then use the WS-I approach.
 
- Anne
 
  _____  

From: Wei Hsu [mailto:whsu@openharbor.com] 
Sent: Thursday, August 19, 2004 5:10 AM
To: axis-user@ws.apache.org
Subject: Declaring Arrays in Doc/Lit Wrapped Style
 
Hi all,
 
I have a question about the XML declaration for an array in doc/lit wrapped
style.  For a server side method with the following signature:
 
String test(String[] value)
 
I had been representing it with the following element:
 
<element name="test">
  <complexType>
    <sequence>
      <element minOccurs="0" maxOccurs="unbounded" name="value"
type="xsd:string" nillable="true"/>
   </sequence>
  </complexType>
</element>
 
This allows me to correctly generate a proxy that matches my original method
when I use WSDL2Java.  However, I recently checked out the WS-I Basic
Profile 1.0, and it gave the following example as the correct way to
represent soapenc:Array.
 
<!-start -->
<xsd:element name="MyArray1" type="tns:MyArray1Type"/>
<xsd:complexType name="MyArray1Type">
  <xsd:sequence>
   <xsd:element name="x" type="xsd:string" 
    minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>
<!-end -->
 
That would mean that for the same "test" method, I should actually be
declaring the "test" element as the following:
 
<element name="test">
  <complexType>
    <sequence>
      <element name="arr" type="tns:MyStringArray"/>
   </sequence>
  </complexType>
</element>
 
<complexType name="MyStringArray">
  <sequence>
    <element minOccurs="0" maxOccurs="unbounded" name="value"
type="xsd:string" nillable="true"/>
 </sequence>
</complexType>
 
However, when I try to use WSDL2Java on that, I end up with the following
signature:
 
String test(MyStringArray arr)
 
Where MyStringArray contains a String[] inside.  This makes sense, but it
sort of confuses me as to which direction is the "correct" one.  Is there
any harm using my current way of representing an array? I also found the
following article, which sort of validates my approach.  
 
http://searchwebservices.techtarget.com/ateQuestionNResponse/0,289625,sid26_
cid569769_tax294325,00.html
 
<exerpt>
As part of section 5.2.3 of the WS-I basic profile, there is an example
showing of the right way to encode an array. Basically, you just use
standard XSD "minOccurs" and "maxOccurs" on an element declaration to
represent an array. If you, in addition, want to define a specific reuseable
type for that array, you create a complex type containing a sequence
containing the repeating element.
</exerpt>
 
 
Any thoughts?
 
 
-Wei