在这篇文章中,我将演示如何在@XmlType批注上使用propOrder属性来控制XML元素的排序。我还将讨论@XmlAccessorType对propOrder配置方式的影响。
@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的元素。
(公共)访问
使用XmlAccessType.PUBLIC_MEMBER 访问时,propOrder属性中的条目对应于属性名称。请注意,在此示例中,属性名称与基础字段名称不同。
领域模型
package blog.xmltype.proporder;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlType(propOrder={"ID", "firstName", "lastName"})
public class Customer {
private String firstName;
private String last_name;
private int id;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return last_name;
}
public void setLastName(String last_name) {
this.last_name = last_name;
}
public int getID() {
return id;
}
public void setID(int id) {
this.id = id;
}
}
XML输出
以下是基于上述模型的XML输出。
<?xml version="1.0" encoding="UTF-8"?>
<customer>
<ID>123</ID>
<firstName>Jane</firstName>
<lastName>Doe</lastName>
</customer>
现场访问
使用字段(实例变量)访问时,propOrder属性中的条目对应于字段名称。
领域模型
package blog.xmltype.proporder;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"id", "firstName", "last_name"})
public class Customer {
private String firstName;
private String last_name;
private int id;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return last_name;
}
public void setLastName(String last_name) {
this.last_name = last_name;
}
public int getID() {
return id;
}
public void setID(int id) {
this.id = id;
}
}
XML输出
由于我们使用的是字段访问,因此元素名称现在基于字段名称。该@XmlElement标注可用于覆盖默认的元素名称。
<?xml version="1.0" encoding="UTF-8"?>
<customer>
<id>123</id>
<firstName>Jane</firstName>
<last_name>Doe</last_name>
</customer>
演示代码
以下演示代码可用于生成上面显示的XML输出。
package blog.xmltype.proporder;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Customer customer = new Customer();
customer.setFirstName("Jane");
customer.setLastName("Doe");
customer.setID(123);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}