`
chainhou
  • 浏览: 172490 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAXB annotation说明及其使用

阅读更多
最近学习REST,,由于jersey的demo中用到了JAXB,就顺便了解了一下。
JAXB的概念一类的就不记录了。
其常用的annotation有如下几个:

    @XmlType
    @XmlElement
    @XmlRootElement
    @XmlAttribute
    @XmlAccessorType
    @XmlAccessorOrder
    @XmlTransient
    @XmlJavaTypeAdapter


其中

    @XmlType
    @XmlRootElement
  @XmlAccessorType
    @XmlAccessorOrder
用在类之上。
对于一个类,可以使用@XmlAccessorType(XmlAccessType.FIELD)来标注整个类的成员变量在转成xml时都可以访问。而如果对对象中的各个属性需要单独设置,即设置其为xml的属性,还是元素,则可以通过@XmlElement,@XmlAttribute单独标注。
以下是JAXB的一个demo
import java.util.ArrayList;
import java.util.List;

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

@XmlRootElement
@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
public class CC {
	String name;
	int age;
	int id;
	List<Book> book = new ArrayList<Book>();

	@XmlElementWrapper(name="books") 
	@XmlElement
	public List<Book> getBook() {
		return book;
	}

	public void setBook(List<Book> book) {
		this.book = book;
	}

	@XmlElement
	public String getName() {
		return name;
	}

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

	@XmlElement
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@XmlAttribute
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return "Customer [id=" + id + ",name=" + name + ",age=" + age + "]";
	}

package com.tectest;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Book {

	private String id;
	private String name;
	private int price;

	@XmlAttribute
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	@XmlElement
	public String getName() {
		return name;
	}

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

	@XmlElement
	public int getPrice() {
		return price;
	}

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



import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

//Marshaller
public class Object2XmlDemo2 {
	public static void main(String[] args) {
	
		CC c = new CC();
		c.setId(200);
		c.setName("suo");
		c.setAge(29);
		
		
		Book book = new Book();
		book.setId("1");
		book.setName("哈里波特");
		book.setPrice(100);
		
		Book book2 = new Book();
		book2.setId("2");
		book2.setName("苹果");
		book2.setPrice(50);
		
		List<Book> bookSet = new ArrayList<Book>();
		bookSet.add(book);
		bookSet.add(book2);
		
		c.setBook(bookSet);
		try {
			File file = new File("D:\\file3.xml");
			JAXBContext jaxbContext = JAXBContext.newInstance(CC.class);
			Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
			// output pretty printed
			jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
			jaxbMarshaller.marshal(c, file);
			jaxbMarshaller.marshal(c, System.out);
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}
}

执行结果:
<cc id="200">
    <age>29</age>
    <books>
        <book id="1">
            <name>哈里波特</name>
            <price>100</price>
        </book>
        <book id="2">
            <name>苹果</name>
            <price>50</price>
        </book>
    </books>
    <name>xxx</name>
</cc>
去掉CC其中的annotation@XmlElementWrapper(name="books")后,执行结果如下。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cc>
    <name>xxx</name>
    <age>29</age>
    <id>200</id>
    <book id="1">
        <name>哈里波特</name>
        <price>100</price>
    </book>
    <book id="2">
        <name>苹果</name>
        <price>50</price>
    </book>
</cc>
而如果使用@XmlAttribute设置CC的id属性后,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="100">
    <age>29</age>
    <book id="1">
        <name>哈里波特</name>
        <price>100</price>
    </book>
    <book id="2">
        <name>苹果</name>
        <price>50</price>
    </book>
    <name>xxx</name>
</customer>



各个annotation的说明:
引用


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

以上说明转自http://www.cnblogs.com/fragranting/archive/2012/03/25/xml--jaxb.html
分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    Java 1.6 API 中文 New

    里面列出了,Java的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 ...

    [Java参考文档].JDK_API 1.6

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    java api最新7.0

    里面列出了Java jdk 1.7的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有...

    JDK_1_6 API

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    JavaAPI1.6中文chm文档 part1

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    JavaAPI中文chm文档 part2

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

    [Java参考文档]

    javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的...

Global site tag (gtag.js) - Google Analytics