用来记录一些原创性的总结
先来看一个示例。现有如下两个类,Order和Product。
@XmlAccessorType(XmlAccessType.FIELD)
public static class Product {
private String id;
private String name;
//省略get/set方法
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class Order {
private Integer id;
private Product product;
private Integer num;
//省略get/set方法
}
如果我们用如下这样的测试代码把Order类型的对象转换为XML结构,会是什么样呢?测试代码如下:
@Test
public void test() {
Product product = new Product();
product.setId("1");
product.setName("香蕉");
Order order = new Order();
order.setId(1);
order.setProduct(product);
order.setNum(10);
JAXB.marshal(order, System.out);
}
生成的XML如下:
<order>
<id>1</id>
<product>
<id>1</id>
<name>香蕉</name>
</product>
<num>10</num>
</order>
如果我们期望Order对象在转换为XML时不是把整个的product的结构都展现出来,而是展现对应的ID,怎么办呢?这个时候就可以使用XmlID和XmlIDREF注解了。XmlID用于指定一个类中的某个属性为其唯一标识,对应的属性类型必须是String,且在一个类中只能有一个属性使用@XmlID注解;XmlIDREF用于指定在把一个对象的某个复杂类型的属性转化为XML时,不是直接转换整个对象的结构,而是转换其对应的XmlID。为此,我们在Product的id属性上加上XmlID注解,在Order的Product属性上加上XmlIDREF注解。
@XmlAccessorType(XmlAccessType.FIELD)
public static class Product {
@XmlID
private String id;
private String name;
//省略get/set方法
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class Order {
private Integer id;
@XmlIDREF
private Product product;
private Integer num;
//省略get/set方法
}
使用上述配置进行之前的测试用例,输出如下内容:
<order>
<id>1</id>
<product>1</product>
<num>10</num>
</order>
可以看到我们的product已经被转换为对应的id表示了。如果我们希望Order中的product属性输出的XML元素名称不是product,而是productId应该怎么办呢?可以加上@XmlElement(name=”productId”)。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class Order {
private Integer id;
@XmlIDREF
@XmlElement(name="productId")
private Product product;
private Integer num;
//省略get/set方法
}
如果希望product能变为order元素的一个属性怎么办呢?可以加上@XmlAttribute注解。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class Order {
private Integer id;
@XmlIDREF
@XmlAttribute
private Product product;
private Integer num;
//省略get/set方法
}
生成的XML内容如下:
<order product="1">
<id>1</id>
<num>10</num>
</order>
(注:本文由Elim写于2017年8月9日)