Custom JAXB bindings for date and date time to use Jode DateTime
.
<?xml version="1.0" encoding="UTF-8"?> <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc" version="2.0"> <jaxb:bindings> <jaxb:globalBindings> <jaxb:serializable/> <xjc:javaType adapter="org.springbyexample.jaxb.beans.adapter.DateXmlAdapter" name="org.joda.time.DateTime" xmlType="xsd:date" /> <xjc:javaType adapter="org.springbyexample.jaxb.beans.adapter.DateTimeXmlAdapter" name="org.joda.time.DateTime" xmlType="xsd:dateTime" /> </jaxb:globalBindings> </jaxb:bindings> </jaxb:bindings>
Entity base model for persistent entities. It is defined as an
xsd:complexType so it can be extended, but
is annotated to have XmlRootElement
so it can be
serialized by JAXB if it is returned directly from a controller
(as opposed to being part of another instance returned).
<xsd:schema xmlns="http://www.springbyexample.org/schema/beans/entity" targetNamespace="http://www.springbyexample.org/schema/beans/entity" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="annox"> <xsd:complexType name="pk-entity-base"> <xsd:annotation> <xsd:appinfo> <annox:annotate> <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="pk-entity-base"/> </annox:annotate> </xsd:appinfo> </xsd:annotation> <xsd:sequence> <xsd:element name="id" type="xsd:int" /> <xsd:element name="lock-version" type="xsd:int" /> <xsd:element name="last-updated" type="xsd:dateTime" /> <xsd:element name="last-update-user" type="xsd:string" /> <xsd:element name="created" type="xsd:dateTime" /> <xsd:element name="create-user" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema>
Responses for single and multiple results. Abstract base classes are defined to provide a way to handle responses more generically in the Java code.
Excerpt from response-base.xsd
<xsd:schema xmlns="http://www.springbyexample.org/schema/beans/response" targetNamespace="http://www.springbyexample.org/schema/beans/response" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="annox" jaxb:version="2.1"> ... <xsd:complexType name="abstract-response"> <xsd:annotation> <xsd:appinfo> <jaxb:class ref="org.springbyexample.schema.beans.response.AbstractResponse"/> </xsd:appinfo> </xsd:annotation> </xsd:complexType> <xsd:complexType name="abstract-response-result"> <xsd:annotation> <xsd:appinfo> <jaxb:class ref="org.springbyexample.schema.beans.response.AbstractResponseResult"/> </xsd:appinfo> </xsd:annotation> </xsd:complexType> <xsd:complexType name="abstract-entity-response-result" abstract="true"> <xsd:complexContent> <xsd:extension base="abstract-response-result"> <xsd:sequence> <xsd:element name="errors" type="xsd:boolean" /> <xsd:element name="message-list" type="message" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="abstract-find-response-result"> <xsd:annotation> <xsd:appinfo> <jaxb:class ref="org.springbyexample.schema.beans.response.AbstractFindResponseResult"/> </xsd:appinfo> </xsd:annotation> </xsd:complexType> <xsd:complexType name="abstract-entity-find-response-result" abstract="true"> <xsd:complexContent> <xsd:extension base="abstract-find-response-result"> <xsd:sequence> <xsd:element name="errors" type="xsd:boolean" /> <xsd:element name="message-list" type="message" minOccurs="0" maxOccurs="unbounded" /> <!-- primarily for paginated results --> <xsd:element name="count" type="xsd:long" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="response-result"> <xsd:annotation> <xsd:appinfo> <annox:annotate> <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="response-result"/> </annox:annotate> </xsd:appinfo> </xsd:annotation> <xsd:complexContent> <xsd:extension base="abstract-response"> <xsd:sequence> <xsd:element name="errors" type="xsd:boolean" /> <xsd:element name="message-list" type="message" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="find-response-result"> <xsd:complexContent> <xsd:extension base="response-result"> <xsd:sequence> <!-- primarily for paginated results --> <xsd:element name="count" type="xsd:long" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="message"> <xsd:sequence> <xsd:element name="message-type" type="message-type" /> <xsd:element name="message" type="xsd:string" /> <xsd:element name="message-key" type="xsd:string" /> <xsd:element name="property" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="message-type"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="INFO" /> <xsd:enumeration value="WARN" /> <xsd:enumeration value="ERROR" /> <xsd:enumeration value="FATAL" /> </xsd:restriction> </xsd:simpleType> </xsd:schema>
Person/Student/Professional complex types and their responses are defined.
<xsd:schema xmlns="http://www.springbyexample.org/schema/beans/person" targetNamespace="http://www.springbyexample.org/schema/beans/person" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="annox" xmlns:entity="http://www.springbyexample.org/schema/beans/entity" xmlns:response="http://www.springbyexample.org/schema/beans/response"> <xsd:import namespace="http://www.springbyexample.org/schema/beans/entity" schemaLocation="entity-base.xsd" /> <xsd:import namespace="http://www.springbyexample.org/schema/beans/response" schemaLocation="response-base.xsd" /> <xsd:element name="person-response"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="response:abstract-entity-response-result"> <xsd:sequence> <xsd:element name="results" type="person" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> <xsd:element name="person-find-response"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="response:abstract-entity-find-response-result"> <xsd:sequence> <xsd:element name="results" type="person" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> <xsd:element name="professional-response"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="response:abstract-entity-response-result"> <xsd:sequence> <xsd:element name="results" type="professional" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> <xsd:element name="professional-find-response"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="response:abstract-entity-find-response-result"> <xsd:sequence> <xsd:element name="results" type="professional" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> <xsd:complexType name="person"> <xsd:annotation> <xsd:appinfo> <annox:annotate> <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="person"/> </annox:annotate> </xsd:appinfo> </xsd:annotation> <xsd:complexContent> <xsd:extension base="entity:pk-entity-base"> <xsd:sequence> <xsd:element name="first-name" type="xsd:string" /> <xsd:element name="last-name" type="xsd:string" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="student"> <xsd:annotation> <xsd:appinfo> <annox:annotate> <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="student"/> </annox:annotate> </xsd:appinfo> </xsd:annotation> <xsd:complexContent> <xsd:extension base="person"> <xsd:sequence> <xsd:element name="school-name" type="xsd:string" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="professional"> <xsd:annotation> <xsd:appinfo> <annox:annotate> <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="professional"/> </annox:annotate> </xsd:appinfo> </xsd:annotation> <xsd:complexContent> <xsd:extension base="person"> <xsd:sequence> <xsd:element name="company-name" type="xsd:string" /> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:schema>