JAXB Annotation初步使用

JAXB(Java Architecture for XML Binding簡稱JAXB)容許Java開發人員將Java類映射爲XML表示方式。JAXB提供兩種主要特性:將一個Java對象序列化爲XML,以及反向操做,將XML解析成Java對象。換句話說,JAXB容許以XML格式存儲和讀取數據,而不須要程序的類結構實現特定的讀取XML和保存XML的代碼。java

一.Jaxb經常使用annotation

@XmlTypeapp

@XmlElementide

@XmlRootElement測試

@XmlAttributethis

@XmlAccessorTypespa

@XmlAccessorOrdercode

@XmlTransientorm

@XmlJavaTypeAdapterxml

 

二.經常使用annotation使用說明

1.@XmlType

@XmlType用在class類的註解,常與@XmlRootElement,@XmlAccessorType一塊兒使用。它有三個屬性:name、propOrder、namespace,常用的只有前兩個屬性。如:對象

@XmlType(name = "basicStruct", propOrder = {

    "intValue",

    "stringArray",

    "stringValue"

)

在使用@XmlType的propOrder 屬性時,必須列出JavaBean對象中的全部屬性,不然會報錯。

 

2.@XmlElement

@XmlElement將java對象的屬性映射爲xml的節點,在使用@XmlElement時,可經過name屬性改變java對象屬性在xml中顯示的名稱。如:

@XmlElement(name="Address")  

private String yourAddress;

 

3.@XmlRootElement

@XmlRootElement用於類級別的註解,對應xml的跟元素,常與 @XmlType 和 @XmlAccessorType一塊兒使用。如:

@XmlType

@XmlAccessorType(XmlAccessType.FIELD)

@XmlRootElement

public class Address {}

 

4.@XmlAttribute

@XmlAttribute用於把java對象的屬性映射爲xml的屬性,並可經過name屬性爲生成的xml屬性指定別名。如:

@XmlAttribute(name="Country")

private String state;

 

5.@XmlAccessorType

@XmlAccessorType用於指定由java對象生成xml文件時對java對象屬性的訪問方式。常與@XmlRootElement、@XmlType一塊兒使用。它的屬性值是XmlAccessType的4個枚舉值,分別爲:

  • XmlAccessType.FIELD:java對象中的全部成員變量

  • XmlAccessType.PROPERTY:java對象中全部經過getter/setter方式訪問的成員變量

  • XmlAccessType.PUBLIC_MEMBER:java對象中全部的public訪問權限的成員變量和經過getter/setter方式訪問的成員變量

  • XmlAccessType.NONE:java對象的全部屬性都不映射爲xml的元素

注意:@XmlAccessorType的默認訪問級別是XmlAccessType.PUBLIC_MEMBER,所以,若是java對象中的private成員變量設置了public權限的getter/setter方法,就不要在private變量上使用@XmlElement和@XmlAttribute註解,不然在由java對象生成xml時會報同一個屬性在java類裏存在兩次的錯誤。同理,若是@XmlAccessorType的訪問權限爲XmlAccessType.NONE,若是在java的成員變量上使用了@XmlElement或@XmlAttribute註解,這些成員變量依然能夠映射到xml文件。

 

6.@XmlAccessorOrder

@XmlAccessorOrder用於對java對象生成的xml元素進行排序。它有兩個屬性值:

AccessorOrder.ALPHABETICAL:對生成的xml元素按字母書序排序

XmlAccessOrder.UNDEFINED:不排序

 

7.@XmlTransient

@XmlTransient用於標示在由java對象映射xml時,忽略此屬性。即,在生成的xml文件中不出現此元素。

 

8.@XmlJavaTypeAdapter

@XmlJavaTypeAdapter經常使用在轉換比較複雜的對象時,如map類型或者格式化日期等。使用此註解時,須要本身寫一個adapter類繼承XmlAdapter抽象類,並實現裏面的方法。

@XmlJavaTypeAdapter(value=xxx.class),value爲本身定義的adapter類

XmlAdapter以下:

public abstract class XmlAdapter<ValueType,BoundType> {
    // Do-nothing constructor for the derived classes.
    protected XmlAdapter() {}
    // Convert a value type to a bound type.
    public abstract BoundType unmarshal(ValueType v);
    // Convert a bound type to a value type.
    public abstract ValueType marshal(BoundType v);
 }

 

三.示例:

Shop.java

package jaxb2;

import javax.xml.bind.annotation.*;
import java.util.Set;


@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "shop", propOrder = {"name", "number", "describer", "address", "orders"})
@XmlRootElement(name = "CHMart")
public class Shop {
    @XmlAttribute
    private String name;

    @XmlElement
    private String number;

    @XmlElement
    private String describer;

    @XmlElementWrapper(name = "orders")
    @XmlElement(name = "order")
    private Set<Order> orders;

    @XmlElement
    private Address address;

    public Shop() {
    }

    public Shop(String name, String number, String describer, Address address) {
        this.name = name;
        this.number = number;
        this.describer = describer;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getDescriber() {
        return describer;
    }

    public void setDescriber(String describer) {
        this.describer = describer;
    }

    public Set<Order> getOrders() {
        return orders;
    }

    public void setOrders(Set<Order> orders) {
        this.orders = orders;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

Order.java

package jaxb2;

import java.math.BigDecimal;
import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlType(name = "order", propOrder = {"shopName", "orderNumber", "price", "amount", "purDate", "customer"})
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Order {

    //  @XmlElement  
    private String shopName;

    @XmlAttribute
    private String orderNumber;

    //  @XmlElement
    @XmlJavaTypeAdapter(value = DateAdapter.class)
    private Date purDate;

    //  @XmlElement
    private BigDecimal price;

    //  @XmlElement
    private int amount;

    //  @XmlElement
    private Customer customer;

    public Order() {
    }

    public Order(String shopName, String orderNumber, Date purDate,
                 BigDecimal price, int amount) {
        this.shopName = shopName;
        this.orderNumber = orderNumber;
        this.purDate = purDate;
        this.price = price;
        this.amount = amount;
    }

    public String getShopName() {
        return shopName;
    }

    public void setShopName(String shopName) {
        this.shopName = shopName;
    }

    public String getOrderNumber() {
        return orderNumber;
    }

    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }

    public Date getPurDate() {
        return purDate;
    }

    public void setPurDate(Date purDate) {
        this.purDate = purDate;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }
}

Customer.java

package jaxb2;

import java.util.Set;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Customer {

    @XmlAttribute
    private String name;

    private String gender;

    private String phoneNo;

    private Address address;

    private Set<Order> orders;

    public Customer() {
    }

    public Customer(String name, String gender, String phoneNo, Address address) {
        this.name = name;
        this.gender = gender;
        this.phoneNo = phoneNo;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getPhoneNo() {
        return phoneNo;
    }

    public void setPhoneNo(String phoneNo) {
        this.phoneNo = phoneNo;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Set<Order> getOrders() {
        return orders;
    }

    public void setOrders(Set<Order> orders) {
        this.orders = orders;
    }
}

Address.java

package jaxb2;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessOrder;
import javax.xml.bind.annotation.XmlAccessorOrder;

@XmlType(propOrder = {"state", "province", "city", "street", "zip"})
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement
public class Address {

    @XmlAttribute
    private String state;

    @XmlElement
    private String province;

    @XmlElement
    private String city;

    @XmlElement
    private String street;

    @XmlElement
    private String zip;

    public Address() {
        super();
    }

    public Address(String state, String province, String city, String street,
                   String zip) {
        super();
        this.state = state;
        this.province = province;
        this.city = city;
        this.street = street;
        this.zip = zip;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getZip() {
        return zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }
}

DateAdapter.java

package jaxb2;

import java.util.Date;
import java.text.SimpleDateFormat;
 
import javax.xml.bind.annotation.adapters.XmlAdapter;
 
public class DateAdapter extends XmlAdapter<String, Date> {
 
    private String pattern = "yyyy-MM-dd HH:mm:ss";
    SimpleDateFormat fmt = new SimpleDateFormat(pattern);
     
    @Override
    public Date unmarshal(String dateStr) throws Exception {
         
        return fmt.parse(dateStr);
    }
 
    @Override
    public String marshal(Date date) throws Exception {
         
        return fmt.format(date);
    }
 
}

 

最後作一個測試:

package jaxb2;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

/**
 * Created with IntelliJ IDEA.
 * User: ASUS
 * Date: 14-7-2
 * Time: 下午6:10
 * To change this template use File | Settings | File Templates.
 */
public class Test {

    public static void main(String[] args) throws JAXBException, IOException {
        Set<Order> orders = new HashSet<Order>();

        Address address1 = new Address("China", "ShangHai", "ShangHai", "Huang", "200000");
        Customer customer1 = new Customer("Jim", "male", "13699990000", address1);
        Order order1 = new Order("Mart", "LH59900", new Date(), new BigDecimal(60), 1);
        order1.setCustomer(customer1);

        Address address2 = new Address("China", "JiangSu", "NanJing", "ZhongYangLu", "210000");
        Customer customer2 = new Customer("David", "male", "13699991000", address2);
        Order order2 = new Order("Mart", "LH59800", new Date(), new BigDecimal(80), 1);
        order2.setCustomer(customer2);

        orders.add(order1);
        orders.add(order2);

        Address address3 = new Address("China", "ZheJiang", "HangZhou", "XiHuRoad", "310000");
        Shop shop = new Shop("CHMart", "100000", "EveryThing", address3);
        shop.setOrders(orders);


        FileWriter writer = null;
        JAXBContext context = JAXBContext.newInstance(Shop.class);
        try {
            Marshaller marshal = context.createMarshaller();
            marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshal.marshal(shop, System.out);

            writer = new FileWriter("shop.xml");
            marshal.marshal(shop, writer);
        } catch (Exception e) {
            e.printStackTrace();
        }

        Unmarshaller unmarshal = context.createUnmarshaller();
        FileReader reader = new FileReader("shop.xml");
        Shop shop1 = (Shop) unmarshal.unmarshal(reader);

        Set<Order> orders1 = shop1.getOrders();
        for (Order order : orders1) {
            System.out.println("***************************");
            System.out.println(order.getOrderNumber());
            System.out.println(order.getCustomer().getName());
            System.out.println("***************************");
        }
    }
}

以上是以一個簡單的商店訂單模型做爲示例。

====END====

相關文章
相關標籤/搜索