The XML Schema type xsd:anyType is the root type for all XML Schema types. All of the primitives are derivatives of this type, as are all user defined complex types. As a result, elements defined as being of xsd:anyType can contain data in the form of any of the XML Schema primitives as well as any complex type defined in a schema document.
In Java the closest matching type is the Object
class. It is the class from which all other Java
classes are sub-typed.
You use the xsd:anyType type as you would any other XML Schema complex type. It can be used as the value of an element
element's type
element. It can also be used as the base type from which other types are defined.
Example 14.5 shows an example of a complex type that contains an element of type xsd:anyType.
Example 14.5. Complex Type with a Wild Card Element
<complexType name="wildStar">
<sequence>
<element name="name" type="xsd:string" />
<element name="ship" type="xsd:anyType" />
</sequence>
</complexType>
Elements that are of type xsd:anyType are mapped to Object
objects. Example 14.6 shows the mapping of Example 14.5 to a Java class.
Example 14.6. Java Representation of a Wild Card Element
public class WildStar { @XmlElement(required = true) protected String name; @XmlElement(required = true) protected Object ship; public String getName() { return name; } public void setName(String value) { this.name = value; } public Object getShip() { return ship; } public void setShip(Object value) { this.ship = value; } }
This mapping allows you to place any data into the property representing the wild card element. The FUSE Services Framework runtime handles the marshaling and unmarshaling of the data into usable Java representation.
When FUSE Services Framework marshals XML data into Java types, it attempts to marshal anyType elements into known
JAXB objects. To determine if it is possible to marshal an anyType element into a JAXB generated object, the runtime
inspects the element's xsi:type
attribute to determine the actual type used to construct the data in the
element. If the xsi:type
attribute is not present, the runtime attempts to identify the element's actual
data type by introspection. If the element's actual data type is determined to be one of the types known by the application's JAXB
context, the element is marshaled into a JAXB object of the proper type.
If the runtime cannot determine the actual data type of the element, or the actual data type of the element is not a known type,
the runtime marshals the content into a org.w3c.dom.Element
object. You will then need to work with the
element's content using the DOM APis.
An application's runtime usually knows about all of the types generated from the schema's included in its contract. This
includes the types defined in the contract's wsdl:types
element, any data types added to the
contract through inclusion, and any types added to the contract through importing other schema documents. You can also make the
runtime aware of additional types using the @XmlSeeAlso
annotation which is described in
Adding Classes to the Runtime Marshaller.
When FUSE Services Framework unmarshals Java types into XML data, it uses an internal map between Java data types and the XML Schema
constructs they represent to determine the XML structure to write to the wire. If the runtime knows the class and can map the class to
an XML Schema construct, it writes out the data and inserts an xsi:type
attribute to identify the type of
data the element contains. If the data is stored in a org.w3c.dom.Element
object, the runtime writes
the XML structure represented by the object but it does not include an xsi:type
attribute.
If the runtime cannot map the Java object to a known XML Schema construct, it throws a marshaling exception. You can add
types to the runtime's map using the @XmlSeeAlso
annotation which is described in
Adding Classes to the Runtime Marshaller.