用来记录一些原创性的总结
有的时候我们的Class
中包含的某些属性只是在系统内部需要使用,并不需要把它转换为XML
提供给外部。这个时候就需要我们对它进行忽略。JAXB
在生成XML
时忽略某个属性的XML
生成有两种方式。
假设我们有这样一个Person类,正常情况下它生成的XML
会是如下这样。
@XmlRootElement
public static class Person {
private Integer id = 1;
private String name = "张三";
private Date createTime = new Date();
//...忽略get和set方法
}
生成的XML
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
<createTime>2017-06-27T16:33:12.333+08:00</createTime>
<id>1</id>
<name>张三</name>
</person>
createTime
是我们内部用的,不需要传递给外部,所以我们需要在生成XML
的时候忽略它,怎么做呢?
XmlTransient
注解是JAXB
的一个注解,用它标注的属性将会在生成XML
时被忽略。所以如果需要忽略createTime
,我们可以在我们的Person类的getCreateTime()
方法上使用@XmlTransient
注解。如果我们指定了生成XML
时以属性为主,那么我们应该将它添加到属性上。我们这里没有指定,JAXB
默认会以get
方法为主,所以我们添加到对应的get
方法上。添加后的代码和效果如下。
@XmlRootElement
public static class Person {
private Integer id = 1;
private String name = "张三";
private Date createTime = new Date();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlTransient
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
生成的XML
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
<id>1</id>
<name>张三</name>
</person>
当我们指定了XmlAccessorType
为XmlAccessType.FIELD
时,我们还可以使用transient
关键字修饰我们的属性,这样JAXB
在转换XML
时也会忽略该属性。使用transient
进行配置的示例代码如下。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class Person {
private Integer id = 1;
private String name = "张三";
private transient Date createTime = new Date();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
运行时在对象转换为XML前指定不需要转换为XML元素的值为null。JAXB在转换XML时当对应的属性值为null时,其会直接忽略该属性值。这个同一个属性在某些场景下需要生成XML,某些场景下又不需要生成XML时是十分有用的。
(本文由Elim写于2017年6月27日)