The JAXB specification defines a number of XML elements that customize how Java types are mapped to XML Schema constructs. These elements can be specified in-line with XML Schema constructs. If you cannot, or do not want to, modify the XML Schema definitions, you can specify the customizations in external binding document.
The elements used to customize the JAXB data bindings are defined in the namespace
http://java.sun.com/xml/ns/jaxb
. You must add a namespace declaration similar to the one
shown in Example 16.1. This is added to the root element of all XML documents
defining JAXB customizations.
When using the JAXB customizations, you must indicate the JAXB version being used. This is done by adding a
jaxb:version
attribute to the root element of the external binding declaration. If you are using in-line
customization, you must include the jaxb:version
attribute in the
schema
element containing the customizations. The value of the attribute is always
2.0
.
Example 16.2 shows an example of the jaxb:version
attribute used in a schema
element.
The most direct way to customize how the code generators map XML Schema constructs to Java constructs is to add the
customization elements directly to the XML Schema definitions. The JAXB customization elements are placed inside the
xsd:appinfo
element of the XML schema construct that is being modified.
Example 16.3 shows an example of a schema containing an in-line JAXB customization.
Example 16.3. Customized XML Schema
<schema targetNamespace="http://widget.com/types/widgetTypes"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<complexType name="size">
<annotation>
<appinfo>
<jaxb:class name="widgetSize" />
</appinfo>
</annotation>
<sequence>
<element name="longSize" type="xsd:string" />
<element name="numberSize" type="xsd:int" />
</sequence>
</complexType>
<schema>
When you cannot, or do not want to, make changes to the XML Schema document that defines your type, you can
specify the customizations using an external binding declaration. An external binding declaration consists of a number of nested
jaxb:bindings
elements. Example 16.4 shows the
syntax of an external binding declaration.
Example 16.4. JAXB External Binding Declaration Syntax
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0"> <jaxb:bindings [schemaLocation="schemaUri
" | wsdlLocation="wsdlUri
"> <jaxb:bindings node="nodeXPath
"> binding declaration </jaxb:bindings> ... </jaxb:bindings> <jaxb:bindings>
The schemaLocation
attribute and the wsdlLocation
attribute
are used to identify the schema document to which the modifications are applied. Use the
schemaLocation
attribute if you are generating code from a schema document. Use the
wsdlLocation
attribute if you are generating code from a WSDL document.
The node
attribute is used to identify the specific XML schema construct that is to be modified. It is an XPath statement that resolves to an XML Schema element.
Given the schema document widgetSchema.xsd
, shown in Example 16.5, the external binding declaration shown in Example 16.6 modifies the generation of the complex type size.
Example 16.5. XML Schema File
<schema targetNamespace="http://widget.com/types/widgetTypes" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" version="1.0"> <complexType name="size"> <sequence> <element name="longSize" type="xsd:string" /> <element name="numberSize" type="xsd:int" /> </sequence> </complexType> <schema>
Example 16.6. External Binding Declaration
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0"> <jaxb:bindings schemaLocation="wsdlSchema.xsd"> <jaxb:bindings node="xsd:complexType[@name='size']"> <jaxb:class name="widgetSize" /> </jaxb:bindings> </jaxb:bindings> <jaxb:bindings>
To instruct the code generators to use the external binging declaration use the wsdl2java tool's
-b
option, as shown below:binding-file
wsdl2java -b widgetBinding.xml widget.wsdl