用来记录一些原创性的总结
有的时候我们的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日)