2013-11-23 35 views
3

尋找一種方法來定義基本XML模式,以便在其他模式上重新使用作爲將用於不同JMS消息有效載荷的XML消息。意圖是:如何使用XML/XSD定義JAXB抽象類並實現繼承?

  • XmlMessage - 定義一個基類消息類,所有消息將作爲發送。
  • 頭 - 類所有消息將包含有關該消息的
  • 體元數據具有 - 抽象類,每一個特定消息的實現可用於定義每個單獨的消息的messagee payolad

這種方法將:

  • 允許JMS EJB將傳入XML解組到高級別的通用XmlMessage中,然後能夠評估Body實現的類類型以確定如何處理消息。
  • 標準化各種消息格式。
  • 利用JAXB生成要在發送消息的客戶端和處理消息的EJB上使用的Java類。
  • 利用JAXB對消息負載中的XML進行編組/解組。

回答

3

請看以下XSD架構和JAXB實現完成定義消息的正文

XmlMessage.xsd一個抽象類定義的所有郵件的格式:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.samnunnally.com" targetNamespace="http://www.samnunnally.com" version="1.0"> 
<xs:element name="xmlMessage"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="header" type="header" minOccurs="1" maxOccurs="1"/> 
      <xs:element ref="body"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:complexType name="header"> 
    <xs:sequence> 
     <xs:element name="message_class" type="xs:string"/> 
     <xs:element name="message_id" type="xs:int"/> 
     <xs:element name="message_length" type="xs:int"/> 
     <xs:element name="software_version" type="xs:string"/> 
     <xs:element name="correlation_id" type="xs:string"/> 
     <xs:element name="session_id" type="xs:string"/> 
     <xs:element name="return_code" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:element name="body" type="body"/> 
<xs:complexType name="body" abstract="true"> 
    <xs:sequence/> 
</xs:complexType> 

示例xsd實現XmlMessage.xsd。結束成爲包含客戶列表的消息Foo。的關鍵是使用substitutionGroup屬性和xs:擴展基板= 「體」

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns="http://www.samnunnally.com" 
     targetNamespace="http://www.samnunnally.com" 
     version="1.0"> 
<xs:include schemaLocation="XmlMessage.xsd"/> 
<xs:element name="foo" type="foo" substitutionGroup="body"/> 
<xs:complexType name="foo"> 
    <xs:complexContent> 
     <xs:extension base="body"> 
      <xs:sequence> 
       <xs:element name="customers" type="customer" minOccurs="1" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 
<xs:complexType name="customer"> 
    <xs:sequence> 
     <xs:element name="customer_id" type="customerId" nillable="false" minOccurs="1" maxOccurs="1"/> 
     <xs:element name="name" type="xs:string"/> 
     <xs:element name="street" type="xs:string"/> 
     <xs:element name="city" type="xs:string"/> 
     <xs:element name="state" type="xs:string"/> 
     <xs:element name="zip" type="xs:string"/> 
     <xs:element name="phone" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="customerId"> 
    <xs:sequence> 
     <xs:element name="id" type="xs:string" minOccurs="1" maxOccurs="1"/> 
    </xs:sequence> 
</xs:complexType> 

由JAXB生成

密鑰Java類:

消息:

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<? extends Body> body; 

    public Header getHeader() { 
     return header; 
    } 

    public void setHeader(Header value) { 
     this.header = value; 
    } 

    public JAXBElement<? extends Body> getBody() { 
     return body; 
    } 

    public void setBody(JAXBElement<? extends Body> value) { 
     this.body = value; 
    } 
} 

身體:

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 { 
} 

Foo留言:

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<Customer> customers; 

    public List<Customer> getCustomers() { 
     if (customers == null) { 
      customers = new ArrayList<Customer>(); 
     } 
     return this.customers; 
    } 

} 
0

我寧願另一種方法。在java中創建抽象並讓JAXB工具爲其生成一個xsd。