2016年6月29日星期三

Java_024:JAXB 批注介绍

1. 批注说明

1.1 @XmlRootElement
XML 文件内容的根元素,必须表明这个注解。
默认的名称是字段名称的全小写,也可以修改名称,并指定一个命名空间。
@XmlRootElement(name="b" nameSpace="http://test")

1.2 @XmlElement
表明该字段是一个 XML 元素。
默认的名称是字段名称的全小写,也可以修改名称。
@XmlElement(name="email-address")

1.3 @XmlAttribute
表明该字段是一个 XML 属性。

1.4 @XmlValue
表明该字段作为父 XML 元素的值输出。

1.5 @XmlAccessorType
是否对字段或 JavaBean 属性进行序列化。

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
可以设置的值有:
(1)FIELD 类中的每个非静态、非瞬态字段将会自动绑定到 XML,除非由 XmlTransient 注解。
(2)NONE 类中的所有字段或属性都不能绑定到 XML,除非使用 JAXB 注解专门对它们进行注解。
(3)PROPERTY 类中的每个get/set方法将会自动绑定到 XML,除非由 XmlTransient 注解。
(4)PUBLIC_MEMBER 每个公共get/set方法对和每个公共字段将会自动绑定到 XML,除非由 XmlTransient 注解。

1.6 @XmlTransient

2. 使用例子

(1)@XmlAccessorType(XmlAccessType.FIELD)

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Boy {
    String name = "CY";
}
生成的 XML 如下:
?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<boy>
  >name>CY</name>
</boy>

(2)@XmlAccessorType(XmlAccessType.PROPERTY)

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
    String name = "CY";
}
因为 name 没有对应的get/set方法,因此 name 不是属性(因为没有 get set方法),所以 name 不能转换成标签。
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<boy/>

(3)@XmlAccessorType(XmlAccessType.PROPERTY)

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
    String name = "CY";

    public String getName() {
       return name;
    }
    public void setName(String name) {
       this.name = name;
    }
}
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<boy>
  <name>CY</name>
</boy>

(4)@XmlAccessorType(XmlAccessType.PROPERTY)

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
    @XmlElement
    int age = 10;
    String name = "CY";

    public String getName() {
       return name;
    }
    public void setName(String name) {
       this.name = name;
    }
}
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<boy>
  <age>10</age>
  <name>CY</name>
</boy>

(5)List 字段

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

    private List<String> emailAddresses;

    public Customer() {
        emailAddresses = new ArrayList<String>();
    }

    public List<String> getEmailAddresses() {
        return emailAddresses;
    }

    public void setEmailAddresses(List<String> emailAddresses) {
        this.emailAddresses = emailAddresses;
    }
}
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <emailAddresses>janed@example.com</emailAddresses>
    <emailAddresses>jdoe@example.org</emailAddresses>
</customer>

(6)@XmlElementWrapper
@XmlElementWrapper 注解在原來字段对应的元素的外面再包一层元素。

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

    @XmlElementWrapper(name="email-addresses")
    @XmlElement(name="email-address")
    private List<String> emailAddresses;

    public Customer() {
        emailAddresses = new ArrayList<String>();
    }

    public List<String> getEmailAddresses() {
        return emailAddresses;
    }

    public void setEmailAddresses(List<String> emailAddresses) {
        this.emailAddresses = emailAddresses;
    }
}
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <email-addresses>
        <email-address>janed@example.com</email-address>
        <email-address>jdoe@example.org</email-address>
    </email-addresses>
</customer>

(7)@XmlList
@XmlList 注解把 List 对象中的每个值,用空格间隔,输出在一行。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
    @XmlList
    private List<String> emailAddresses;
}
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <emailAddresses>janed@example.com jdoe@example.org</emailAddresses>
</customer>

(8)@XmlList + @XmlAttribute

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
    @XmlList
    @XmlAttribute
    private List<String> emailAddresses;
}
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer
   emailAddresses="janed@example.com jdoe@example.org"/>
<customer>

(9)@XmlList + @XmlValue

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
    @XmlList
    @XmlValue
    private List<String> emailAddresses;
}
生成的 XML 如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>janed@example.com jdoe@example.org</customer>

参考文献:
1. http://jackyrong.iteye.com/blog/1890669
2. http://desert3.iteye.com/blog/1570092

没有评论: