用来记录一些原创性的总结
正常情况使用JAXB生成的XML的元素顺序是混乱的,比如我们来看下面这个示例,我们有一个Person
类,里面有几个属性,我们需要把它直接转换为对应的XML表示。
public class ElementOrderTest {
@Test
public void test() {
Person person = new Person();
JAXB.marshal(person, System.out);
}
public static class Person {
private Integer id = 1;
private String name = "张三";
private Integer dept = 1;
private Date registTime = new Date();
private String username = "zhangsan";
//...省略get和set方法
}
}
生成出来的XML如下所示,基本上是没有规则的。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
<dept>1</dept>
<id>1</id>
<name>张三</name>
<registTime>2017-06-22T20:27:05.070+08:00</registTime>
<username>zhangsan</username>
</person>
但有时候我们又期望它能够以明确的顺序输出。比如上面的Person
我们希望输出的元素顺序依次是id
、name
、username
、dept
、registTime
,那应该怎么办呢?JAXB对此的支持是通过在类上使用@XmlType
注解来进行标注,通过其propOrder
属性来指定属性被转换为XML的顺序,它里面指定的值是对应的对应的属性,而不是生成的XML的元素名称。所以对此我们只需要在Person
类上添加XmlType
注解即可。
@XmlRootElement
@XmlType(propOrder={"id", "name", "username", "dept", "registTime"})
public static class Person {
private Integer id = 1;
private String name = "张三";
private Integer dept = 1;
private Date registTime = new Date();
private String username = "zhangsan";
//...省略get和set方法
}
通过XmlType
的propOrder
属性指定了属性生成XML的顺序后输出结果如下。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
<id>1</id>
<name>张三</name>
<username>zhangsan</username>
<dept>1</dept>
<registTime>2017-06-22T20:39:29.994+08:00</registTime>
</person>
如果我们需要指定节点顺序的对象不是根节点,其子节点的顺序指定方式也是一样的。假设我们现在需要在Person
上新加一个Post
类型的属性,Post
对应的是员工的岗位,其有三个属性,我们要求这三个属性生成的XML元素的顺序必须是id
、name
、level
。则我们可以进行如下定义。
@XmlRootElement
@XmlType(propOrder = { "id", "name", "username", "dept", "post", "registTime" })
public static class Person {
private Integer id = 1;
private String name = "张三";
private Integer dept = 1;
private Date registTime = new Date();
private String username = "zhangsan";
private Post post = new Post();//岗位
//...省略get和set方法
}
@XmlType(propOrder={"id", "name", "level"})
public static class Post {
private Integer id = 1;
private String name = "产品经理";// 岗位名称
private Integer level = 5;// 职级
//...省略get和set方法
}
生成出来的XML效果如下所示。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
<id>1</id>
<name>张三</name>
<username>zhangsan</username>
<dept>1</dept>
<post>
<id>1</id>
<name>产品经理</name>
<level>5</level>
</post>
<registTime>2017-06-22T20:55:35.834+08:00</registTime>
</person>
(本文由Elim写于2017年6月22日)