This page present several options to define a web service interface that uses polymorphism on list of objects. It compares various possible web service interface definition.
My preferred pattern is #5. It was used in one of our web service and works nice.
See also http://www.ibm.com/developerworks/webservices/library/ws-tip-xsdchoice.html
Wrapper with two collections
| N° | 1 |
| Name | Wrapper with two collections |
| Description | Declaration of two list to hold each kind of filters |
| Java definition |
Class FilterClause
{
@XmlElement(name="termFilter")
List<TermFilter> termFilers;
@XmlElement(name="fullTextFilter")
List<FullTextFilter> ftFilters;
}
|
| Distinction between null or empty list | Yes – if lists are empty, filterClause tag is still there |
| Expected SOAP request | <filterClause> <termFilter> <name>edoc:Date</name> <operator>=</operator><value>2005-10-10</value> </termFilter> </filterClause> |
| Pro |
|
| Cons |
|
Wrapper with polymorphism on tag name
| N° | 2 |
| Name | Wrapper with polymorphism on tag name (xsd :choice) |
| Description | Declaration of one list with xsd:choice to distinguish the type of the elements and change the tag accordingly |
| Java definition |
public class FilterClause
{ @XmlElements({
@XmlElement(name="termFilter", type=TermFilter.class),
@XmlElement(name="fullTextFilter",type=FullTextFilter.class)
})private Listfilter; }
|
| Distinction between null or empty list | Yes – if lists are empty, filterClause tag is still there |
| Expected SOAP request | <filterClause> <termFilter> <name>edoc:Date</name> <operator>=</operator><value>2005-10-10</value> </termFilter> </filterClause> |
| Pro |
|
| Cons |
|
Wrapper with polymorphism with xsi:type
| N° | 3 |
| Name | Wrapper with polymorphism with xsi:type |
| Description | Usage of a wrapper with the declaration of one list using base type – polymorphism is detected automatically by JAXB & .NET |
| Java definition |
public class FilterClause
{@XmlElement(name="filter")private Listfilters;}
|
| Distinction between null or empty list | Yes – if lists are empty, filterClause tag is still there |
| Expected SOAP request | <filterClause> <filter xmlns:q1=”http://www.imtf.com/hypersuite/hydra” xsi:type=”q1:termFilter”> <name>edoc:Date</name> <operator>=</operator> <value>2005-10-10</value> </filter> </filterClause> |
| Pro |
|
| Cons |
|
Polymorphic list on tag name
| N° | 4 |
| Name | Polymorphic list on tag name (xsd :choice) |
| Description | Same as 2 without wrapper |
| Java definition | Can not be defined in Java, because @XmlElement can not be applied on the parameter of a method signature |
| Distinction between null or empty list | No – if list is empty or null not tags are written |
| Expected SOAP request | <termFilter> <name>edoc:Date</name> <operator>=</operator><value>2005-10-10</value> </termFilter> |
| Pro | See comment in Java definition |
| Cons | See comment in Java definition |
Polymorphic list with xsi:type
| N° | 5 |
| Name | Polymorphic list with xsi:type |
| Description | Same as 3 without wrapper |
| Java definition |
@XmlSeeAlso({FullTextFilter.class,TermFilter.class})
public class XXXX
{
@WebParam(name="filter")
List<Filter> filters;
|
| Distinction between null or empty list | No – if list is empty or null not tags are written |
| Expected SOAP request | <filter xmlns:q1=”http://www.imtf.com/hypersuite/hydra” xsi:type=”q1:termFilter”> <name>edoc:Date</name> <operator>=</operator> <value>2005-10-10</value> </filter> |
| Pro |
|
| Cons |
|