Jaxb中的注解关键字说明

一.Jaxb处理java对象和xml之间转换常用的annotation有:

  1. @XmlType
  2. @XmlElement
  3. @XmlRootElement
  4. @XmlAttribute
  5. @XmlAccessorType
  6. @XmlAccessorOrder
  7. @XmlTransient
  8. @XmlJavaTypeAdapter

 二.常用annotation使用说明

  1. @XmlType

  @XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:

@XmlType(name = "basicStruct", propOrder = {
    "intValue",
    "stringArray",
    "stringValue"
)
在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。

  [email protected]

  @XmlElement将java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。如:

  @XmlElement(name="Address")  

  private String yourAddress;

  [email protected]

  @XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一起使用。如:

  @XmlType

  @XmlAccessorType(XmlAccessType.FIELD)

  @XmlRootElement

  public class Address {}

  [email protected]

  @XmlAttribute用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。如:

  @XmlAttribute(name="Country")

  private String state;

  [email protected]

  @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文件。

  [email protected]

  @XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:

  AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序

  XmlAccessOrder.UNDEFINED:不排序

  [email protected]

  @XmlTransient用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。

  [email protected]

  @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);
 }

 三.示例

  1.Shop.java

package
jaxb.shop;

import
java.util.Set;

import
javax.xml.bind.annotation.XmlAccessOrder;

import
javax.xml.bind.annotation.XmlAccessType;

import
javax.xml.bind.annotation.XmlAccessorType;

import
javax.xml.bind.annotation.XmlAttribute;

import
javax.xml.bind.annotation.XmlElement;

import
javax.xml.bind.annotation.XmlRootElement;

import
javax.xml.bind.annotation.XmlType;

import
javax.xml.bind.annotation.XmlElementWrapper;

import
javax.xml.bind.annotation.XmlAccessorOrder;

@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;

    }

    getter/setter略

//同时使用了@XmlType(propOrder={})和@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL),但是生成的xml只按照propOrder定义的顺序生成元素

  2.Order.java

package
jaxb.shop;

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;

    }

getter/setter略

//@XmlAccessorType(XmlAccessType.FIELD),所以此处注释掉了@XmlElement,xml中依然会生成这些元素

  3.Customer.java

package
jaxb.shop;

import
java.util.Set;

import
javax.xml.bind.annotation.XmlType;

import
javax.xml.bind.annotation.XmlAttribute;

import
javax.xml.bind.annotation.XmlElement;

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;

    }

getter/setter略

  4.Address.java

package
jaxb.shop;

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;

    }

getter/setter略

//注意:虽然@XmlAccessorType为XmlAccessType.NONE,但是在java类的私有属性上加了@XmlAttribute和@XmlElement注解后,这些私有成员会映射生成xml的元素

  5.DateAdapter.java

package
jaxb.shop;

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);

    }

}

//用于格式化日期在xml中的显示格式,并且由xml unmarshal为java对象时,将字符串解析为Date对象

  6.ShopTest.java

package
jaxb.shop;

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;

import
javax.xml.bind.JAXBContext;

import
javax.xml.bind.JAXBException;

import
javax.xml.bind.Marshaller;

import
javax.xml.bind.Unmarshaller;

public
class
ShopTest {

    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.setOrder(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.getOrder();

        for(Order order : orders1){

            System.out.println("***************************");

            System.out.println(order.getOrderNumber());

            System.out.println(order.getCustomer().getName());

            System.out.println("***************************");

        }

    }

}

  7.生成的xml文件

<?xml version="1.0"
encoding="UTF-8"
standalone="yes"?>

<CHMart name="CHMart">

    <number>100000</number>

    <describer>EveryThing</describer>

    <address state="China">

        <province>ZheJiang</province>

        <city>HangZhou</city>

        <street>XiHuRoad</street>

        <zip>310000</zip>

    </address>

    <orders>

        <order orderNumber="LH59800">

            <shopName>Mart</shopName>

            <price>80</price>

            <amount>1</amount>

            <purDate>2012-03-25
12:57:23</purDate>

            <customer name="David">

                <gender>male</gender>

                <phoneNo>13699991000</phoneNo>

                <address state="China">

                    <province>JiangSu</province>

                    <city>NanJing</city>

                    <street>ZhongYangLu</street>

                    <zip>210000</zip>

                </address>

            </customer>

        </order>

        <order orderNumber="LH59900">

            <shopName>Mart</shopName>

            <price>60</price>

            <amount>1</amount>

            <purDate>2012-03-25
12:57:23</purDate>

            <customer name="Jim">

                <gender>male</gender>

                <phoneNo>13699990000</phoneNo>

                <address state="China">

                    <province>ShangHai</province>

                    <city>ShangHai</city>

                    <street>Huang</street>

                    <zip>200000</zip>

                </address>

            </customer>

        </order>

    </orders>

</CHMart>

  以上是以一个简单的商店订单模型作为示例。

时间: 2024-10-06 23:45:13

Jaxb中的注解关键字说明的相关文章

【java】java中的注解(Annotation)是如何工作的?

Java中的注解是如何工作的? 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解.这篇文章中,我将向大家讲述到底什么是注解,为什么要引入注解,注解是如何工作的,如何编写自定义的注解(通过例子),什么情况下可以使用注解以及最新注解和ADF(应用开发框架).这会花点儿时间,所以为自己准备一杯咖啡,让我们来进入注解的世界吧. 什么是注解? 用一个词就可以描述注解,那就是元数据,即

java中的注解(Annotation)

转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到源代码中使用其他工具可以对其进行处理的标签.注解不会改变程序的编译方式.java编译器会对包含注解与不包含注解的代码生成相同的虚拟机指令.在java中,注解是被当做修饰符(如public/static之类)来使用的. 注解与注释 注释是供人看的,注解是供程序调用的.一种是程序员写给另一个程序员的,一

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

浅析Java中的final关键字

原文出处: 海子 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字

转载:浅析Java中的final关键字

文章转自:http://www.cnblogs.com/dolphin0520/p/3736238.html 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cn

myBatis中的注解@Param、返回值为Map、JAVA读取Excel并解析文本、Class.getResource()和ClassLoader.getResource()

myBatis中的注解@Param:http://blog.csdn.net/gao36951/article/details/44258217:  http://www.cnblogs.com/thomas12112406/p/6217211.html. myBatis返回值为Map:http://blog.csdn.net/werewr342352321df/article/details/11892755. ====================== JAVA读取Excel并解析文本:h

(转)Java中的static关键字解析

转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: "static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static方法的主要用途." 这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键

PHP中的常用关键字

PHP中常用的关键字:final .static.const.... final : 1.final不能修饰成员属性 2.final只能修饰类和方法 final作用: 1.使用final修饰的类不能被子类继续 2.使用final修饰的方法不能被子类去覆盖 3.用来限制类不被继承,方法不被覆盖就使用final static: 1.使用static可以修饰成员的属性和成员的方法,不能修饰类 2.使用static修饰的成员属性,可以被同一个类的所有对象共享 3.静态的数据是存在内存中的 数据段 中(初

C++ 类中的const关键字

//类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是this指针 int GetX() const //====>int GetX(const this) { //因为this被隐藏,所以const关键字只好写在函数后面 //x++; //加上const关键字 报错 error C3490: 由于正在通过常量对象访问“x”,因此无法对其进行修改 //这个