XML Schema supports a mechanism for defining data types that are a list of space separated simple types. An example of
an element, primeList
, using a list type is shown in
Example 12.7.
XML Schema list types are generally mapped to Java List<T>
objects. The only variation to this pattern is when a message part is mapped directly to an instance of an XML Schema list type.
XML Schema list types are simple types and as such are defined using a simpleType
element. The most common syntax used to define a list type is shown in Example 12.8.
Example 12.8. Syntax for XML Schema List Types
<simpleType name="listType
"> <list itemType="atomicType
"> <facet value="value
" /> <facet value="value
" /> ... </list> </simpleType>
The value given for atomicType
defines the type of the elements in the list. It can only be one of the built in XML Schema atomic types, like xsd:int or xsd:string, or a user-defined simple type that is not a list.
In addition to defining the type of elements listed in the list type, you can also use facets to further constrain the properties of the list type. Table 12.3 shows the facets used by list types.
Table 12.3. List Type Facets
Facet | Effect |
---|---|
length | Defines the number of elements in an instance of the list type. |
minLength | Defines the minimum number of elements allowed in an instance of the list type. |
maxLength | Defines the maximum number of elements allowed in an instance of the list type. |
enumeration | Defines the allowable values for elements in an instance of the list type. |
pattern | Defines the lexical form of the elements in an instance of the list type. Patterns are defined using regular expressions. |
For example, the definition for the simpleList
element shown in Example 12.7, is shown in Example 12.9.
Example 12.9. Definition of a List Type
<simpleType name="primeListType"> <list itemType="int"/> </simpleType> <element name="primeList" type="primeListType"/>
In addition to the syntax shown in Example 12.8 you can also define a list type using the less common syntax shown in Example 12.10.
Example 12.10. Alternate Syntax for List Types
<simpleType name="listType"> <list> <simpleType> <restriction base="atomicType"> <facet value="value"/> <facet value="value"/> ... </restriction> </simpleType> </list> </simpleType>
When an element is defined a list type, the list type is mapped to a collection property. A collection property is a Java
List<T>
object. The template class used by the List<T>
is the
wrapper class mapped from the list's base type. For example, the list type defined in
Example 12.9 is mapped to a List<Integer>
.
For more information on wrapper type mapping see Wrapper classes.
When a message part is defined as a list type, or is mapped to an element of a list type, the resulting method parameter is
mapped to an array instead of a List<T>
object. The base type of the array is the wrapper class
of the list type's base class.
For example, the WSDL fragment in Example 12.11 results in the method signature shown in Example 12.12.
Example 12.11. WSDL with a List Type Message Part
<definitions ...>
...
<types ...>
<schema ... >
<simpleType name="primeListType">
<list itemType="int"/>
</simpleType>
<element name="primeList" type="primeListType"/>
</schemas>
</types>
<message name="numRequest">
<part name="inputData" element="xsd1:primeList" />
</message>
<message name="numResponse">;
<part name="outputData" type="xsd:int">
...
<portType name="numberService">
<operation name="primeProcessor">
<input name="numRequest" message="tns:numRequest" />
<output name="numResponse" message="tns:numResponse" />
</operation>
...
</portType>
...
</definitions>
Example 12.12. Java Method with a List Type Parameter
public interface NumberService {
@XmlList
@WebResult(name = "outputData", targetNamespace = "", partName = "outputData")
@WebMethod
public int primeProcessor(
@WebParam(partName = "inputData", name = "primeList", targetNamespace = "...")
java.lang.Integer[] inputData
);
}