Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Please see the following XSD schemas and JAXB implementations to accomplish defining an abstract class for the Message’s Body</p> <p>XmlMessage.xsd to define the format of all messages:</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.samnunnally.com" targetNamespace="http://www.samnunnally.com" version="1.0"&gt; &lt;xs:element name="xmlMessage"&gt; &lt;xs:complexType&gt; &lt;xs:sequence&gt; &lt;xs:element name="header" type="header" minOccurs="1" maxOccurs="1"/&gt; &lt;xs:element ref="body"/&gt; &lt;/xs:sequence&gt; &lt;/xs:complexType&gt; &lt;/xs:element&gt; &lt;xs:complexType name="header"&gt; &lt;xs:sequence&gt; &lt;xs:element name="message_class" type="xs:string"/&gt; &lt;xs:element name="message_id" type="xs:int"/&gt; &lt;xs:element name="message_length" type="xs:int"/&gt; &lt;xs:element name="software_version" type="xs:string"/&gt; &lt;xs:element name="correlation_id" type="xs:string"/&gt; &lt;xs:element name="session_id" type="xs:string"/&gt; &lt;xs:element name="return_code" type="xs:string"/&gt; &lt;/xs:sequence&gt; &lt;/xs:complexType&gt; &lt;xs:element name="body" type="body"/&gt; &lt;xs:complexType name="body" abstract="true"&gt; &lt;xs:sequence/&gt; &lt;/xs:complexType&gt; </code></pre> <p></p> <p>Example xsd implementing XmlMessage.xsd. Ends up being message Foo containing a list of customers. The key is to use substitutionGroup attribute and xs:extension base="body"</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.samnunnally.com" targetNamespace="http://www.samnunnally.com" version="1.0"&gt; &lt;xs:include schemaLocation="XmlMessage.xsd"/&gt; &lt;xs:element name="foo" type="foo" substitutionGroup="body"/&gt; &lt;xs:complexType name="foo"&gt; &lt;xs:complexContent&gt; &lt;xs:extension base="body"&gt; &lt;xs:sequence&gt; &lt;xs:element name="customers" type="customer" minOccurs="1" maxOccurs="unbounded"/&gt; &lt;/xs:sequence&gt; &lt;/xs:extension&gt; &lt;/xs:complexContent&gt; &lt;/xs:complexType&gt; &lt;xs:complexType name="customer"&gt; &lt;xs:sequence&gt; &lt;xs:element name="customer_id" type="customerId" nillable="false" minOccurs="1" maxOccurs="1"/&gt; &lt;xs:element name="name" type="xs:string"/&gt; &lt;xs:element name="street" type="xs:string"/&gt; &lt;xs:element name="city" type="xs:string"/&gt; &lt;xs:element name="state" type="xs:string"/&gt; &lt;xs:element name="zip" type="xs:string"/&gt; &lt;xs:element name="phone" type="xs:string"/&gt; &lt;/xs:sequence&gt; &lt;/xs:complexType&gt; &lt;xs:complexType name="customerId"&gt; &lt;xs:sequence&gt; &lt;xs:element name="id" type="xs:string" minOccurs="1" maxOccurs="1"/&gt; &lt;/xs:sequence&gt; &lt;/xs:complexType&gt; </code></pre> <p></p> <p>Key Java classes generated by JAXB:</p> <p>Message:</p> <pre><code>package com.samnunnally; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "header", "body" }) @XmlRootElement(name = "xmlMessage") public class XmlMessage { @XmlElement(required = true) protected Header header; @XmlElementRef(name = "body", namespace = "http://www.samnunnally.com", type = JAXBElement.class) protected JAXBElement&lt;? extends Body&gt; body; public Header getHeader() { return header; } public void setHeader(Header value) { this.header = value; } public JAXBElement&lt;? extends Body&gt; getBody() { return body; } public void setBody(JAXBElement&lt;? extends Body&gt; value) { this.body = value; } } </code></pre> <p>Body:</p> <pre><code>package com.samnunnally; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "body") @XmlSeeAlso({ Foo.class }) public abstract class Body { } </code></pre> <p>Foo message:</p> <pre><code>package com.samnunnally; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "foo", propOrder = { "customers" }) public class Foo extends Body { @XmlElement(required = true) protected List&lt;Customer&gt; customers; public List&lt;Customer&gt; getCustomers() { if (customers == null) { customers = new ArrayList&lt;Customer&gt;(); } return this.customers; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload