Skip to content
springside edited this page Apr 24, 2012 · 4 revisions

##Overview 参见Serialize总述

JAXB的文档: http://jaxb.java.net/nonav/2.2.5/docs/ user guide和change log都在里面了,注意文档的版本。

##SpringSide-Core中的JaxbMapper Jaxb中最讨厌的地方,是需要在构造JAXBContext时,预先设定可能会处理的Root Element Types。 因此JaxbMapper也不是一个只提供static方法的工具类,必须在构造函数传入Element Types进行构造。

第二麻烦就是处理顶级对象是个Collection,而不是POJO的场景。 JAXBMapper专门提供了如下的toXML函数,使用了一个注释了@XmlAnyElement的Wrapper来实现。

String toXml(Collection<?> root, String rootName)

另外JAXBContext是线程安全的可任意重用。Marshaller和createUnmarshaller则最好每次创建。

##SpringSide showcase中的JaxbDemo

Jaxb目录下的User对象演示了几种典型的Jaxb Annotation, 包括@XmlAttribute, @XmlTransient, @XmlType(propOrder = {...})
还有另一个常用的配置是将Collection属性输出成大家一般期望的样子。 比如:

	@XmlElementWrapper(name = "roles")
	@XmlElement(name = "role")
	public List<Role> getRoles() {
		return roles;
	}

必须要这样以后, 输出才是大家一般期望样子,这是JAXB第三个傻的地方。

<roles><role id="1" name="admin"/></roles>

最后,还演示了Map<String,String>序列化到下面的样子,这是最高境界了,使用了@XmlJavaTypeAdapter 和 一个自己写的HouseMapAdapter。这么复杂的情况,再让我写一次出来都不一定能行。 建议还是懒一点,按默认输出,难看就难看一点了。

<houses>
	<house key="bj">house1</item>
	<hosue key="gz">house2</item>
</houses>

返回参考手册

Clone this wiki locally