Elim的博客

用来记录一些原创性的总结


Elim

JAXB生成XML时忽略某个属性

有的时候我们的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

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>

方式二:把属性使用transient修饰

当我们指定了XmlAccessorTypeXmlAccessType.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;
		}
	}

方式三:运行时指定对应的属性值为null

运行时在对象转换为XML前指定不需要转换为XML元素的值为null。JAXB在转换XML时当对应的属性值为null时,其会直接忽略该属性值。这个同一个属性在某些场景下需要生成XML,某些场景下又不需要生成XML时是十分有用的。

(本文由Elim写于2017年6月27日)