JAXB 實現List介面

來源:互聯網
上載者:User
JAXB and Choosing the List Implementation For elements with max occurs greater than one, JAXB will generate a j ava.util.List property and the underlying implementation will be java.util.ArrayList.  You can control which list implementation is used through internal and external schema annotations.  You can also use your own domain objects which gives you full control of your object model.  This post will discuss these different options.

Option #1 - Default JAXB Generation We will use the following XML schema for this post:

12345678910111213141516 <?xml version="1.0" encoding="UTF-8"?> <xsd:schema    xmlns:xsd="http://www.w3.org/2001/XMLSchema">       <xsd:element name="customer">         <xsd:complexType>             <xsd:sequence>                 <xsd:element                     name="phone-number"                     type="xsd:string"                     maxOccurs="unbounded"/>             </xsd:sequence>         </xsd:complexType>     </xsd:element>   </xsd:schema>

Using the following command line:

1 xjc -d out customer.xsd

JAXB will generate the following class.  This class has a java.util.List property with java.util.ArrayList as the underlying implementation:

123456789101112131415161718192021222324252627 package generated;   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.XmlRootElement; import javax.xml.bind.annotation.XmlType;   @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = {"phoneNumber"}) @XmlRootElement(name = "customer") public class Customer {       @XmlElement(name = "phone-number", required = true)     protected List<String> phoneNumber;       public List<STRING> getPhoneNumber() {         if (phoneNumber == null) {             phoneNumber = new ArrayList<String>();         }         return this.phoneNumber;     }   } </STRING>

Option #2 - Customizing the Generation If you wish to control the underlying implementation you can use an external binding file.  We will use the bindings file below to change the underlying implementation to be java.util.LinkedList:

123456789101112 <jxb:bindings     xmlns:xs="http://www.w3.org/2001/XMLSchema"    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"    version="2.1">       <jxb:bindings schemaLocation="customer.xsd">         <jxb:bindings node="//xs:element[@name='customer']/xs:complexType/xs:sequence/xs:element[@name='phone-number']">             <jxb:property collectionType="java.util.LinkedList"/>         </jxb:bindings>     </jxb:bindings>   </jxb:bindings>

And the following XJC call:

1 xjc -d out -b binding.xml customer.xsd

To get the following class instead:

123456789101112131415161718192021222324252627 package generated;   import java.util.LinkedList; 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.XmlRootElement; import javax.xml.bind.annotation.XmlType;   @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = {"phoneNumber"}) @XmlRootElement(name = "customer") public class Customer {       @XmlElement(name = "phone-number", required = true)     protected List<STRING> phoneNumber = new LinkedList<STRING>();       public List<STRING> getPhoneNumber() {         if (phoneNumber == null) {             phoneNumber = new LinkedList<STRING>();         }         return this.phoneNumber;     }   } </STRING></STRING></STRING></STRING>

Option #3 - Using Your Own Domain Class Generally you should interact with the java.util.List interface whenever possible.  However in your own domain classes you are free to make your properties any of the java.util.List implementations you wish (perhaps to make use of calls like java.util.ArrayList.trimToSize()).

12345678910111213141516171819202122232425 package com.example;   import java.util.ArrayList; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement;   @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "customer") public class Customer {       @XmlElement(name = "phone-number", required = true)     protected ArrayList<STRING> phoneNumber;       public Customer() {         phoneNumber = new ArrayList<STRING>();     }       public ArrayList<STRING> getPhoneNumber() {         return this.phoneNumber;     }   } </STRING></STRING></STRING>
轉自:http://blog.bdoughan.com/2011/01/jaxb-and-choosing-list-implementation.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.