領域模型
在此示例中,我將使用以下域模型。 注意如何沒有任何類型的注釋。
顧客
在此示例中, 客戶是根對象。 通常,我們將使用@XmlRootElement對其進行注釋 。 稍后在演示代碼中,您將看到我們如何使用JAXBElement實例。
package blog.defaults;import java.util.List;public class Customer {private String firstName;private String lastName;private List<PhoneNumber> phoneNumbers;public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public List<PhoneNumber> getPhoneNumbers() {return phoneNumbers;}public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {this.phoneNumbers = phoneNumbers;}}
電話號碼
我有目的地給了此類中的字段廢話名稱,以便稍后在查看XML時,您將能夠看到默認情況下元素名稱是從屬性而不是字段派生的。
package blog.defaults;public class PhoneNumber {private String foo;private String bar;public String getType() {return foo;}public void setType(String type) {this.foo = type;}public String getNumber() {return bar;}public void setNumber(String number) {this.bar = number;}}
示范代碼
由于我們沒有使用@XmlRootElement (或@XmlElementDecl )將根元素與Customer類相關聯,因此我們需要告訴JAXB我們要將XML文檔解組到哪個類。 這可以通過使用采用Class參數(第14行)的解組方法之一來完成。 這將返回J AXBElement ,然后通過在其上調用getValue來訪問Customer對象(第15行)。 為了將對象封送回XML,我們需要確保將其包裝在JAXBElement中以提供根元素信息(第17行)。
package blog.defaults;import javax.xml.bind.*;
import javax.xml.namespace.QName;
import javax.xml.transform.stream.StreamSource;public class Demo {public static void main(String[] args) throws Exception {JAXBContext jc = JAXBContext.newInstance(Customer.class);StreamSource xml = new StreamSource("src/blog/defaults/input.xml");Unmarshaller unmarshaller = jc.createUnmarshaller();JAXBElement<Customer> je1 = unmarshaller.unmarshal(xml, Customer.class);Customer customer = je1.getValue();JAXBElement<Customer> je2 = new JAXBElement<Customer>(new QName("customer"), Customer.class, customer);Marshaller marshaller = jc.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.marshal(je2, System.out);}}
input.xml /輸出
以下是運行演示代碼的輸入和輸出。 我們首先看到的是,它是數據的非常合理的XML表示形式,沒有任何JAXB工件。 默認情況下,JAXB將所有內容封送為XML元素,根據PhoneNumber類,我們看到元素名稱是從屬性名稱派生的。
<?xml version="1.0" encoding="UTF-8"?>
<customer><firstName>Jane</firstName><lastName>Doe</lastName><phoneNumbers><number>555-1111</number><type>work</type></phoneNumbers><phoneNumbers><number>555-2222</number><type>home</type></phoneNumbers>
</customer>
進一步閱讀
如果您喜歡這篇文章,那么您可能也會對以下內容感興趣:
- 該博客上的大多數文章都描述了如何利用JAXB元數據的功能來支持不同的用例,我邀請您檢查一下它們:
- http://blog.bdoughan.com/?tag=jaxb
- 如果您有興趣在不使用批注的情況下指定元數據,則可能對EclipseLink JAXB(MOXy)的外部映射文檔感興趣:
- 擴展JAXB –將元數據表示為XML
- 擴展JAXB –將元數據表示為JSON
參考: JAXB – Java XML和JSON綁定博客中的JCG合作伙伴 Blaise Doughan 不需要注釋 。
翻譯自: https://www.javacodegeeks.com/2012/07/jaxb-no-annotations-required.html