CXF之JAXB
通常情况下我们不直接传对象,因为直接传递对象安全性差,而且暴露了实体对象。所以我们选择传递XML文件,当然也可以传递JSON对象。对于传递XML,JAX-WS采用的是JAXB工具。
JAXB(Java Architecture for XML Binding)提供了一个快速而方便的方式绑定XML Schemas和java,使java程序员能够很方便的在java应用程序中处理XML数据。JAXB提供了将XML文档解组为java内容树的方法, 以及将java内容树重新编组回XML文档的方法。JAXB同样也提供了一种从java对象生成XML Schema的方式。
Java Architecture for XML Binding (JAXB)
这里有几个重要的定义:
编组(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的 扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。
工作原理如下图所示:
解组(Unmarshalling) 是把数据从存储媒介转换到内存中的过程--正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。
工作原理如下图所示:
JAXB 数据类型相互映射
JAXB 2.0 Default Data Type Mapping
JAVA 2.0 other Date Type Mapping
JAXBElement Object:当xml element不能用Java表示时,此时提供一个JAXBElement,用于getting/setting object name 和object value 。
Java-to-Schema Mapping(here list the mapping of Java classes to XML data types):在Java EE5 中的JAXB注解元素在 javax.xml.bind.annotation包中。
JAXB annotation
@XmlRootElement 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中会以一个全局元素的形式出现,元素的类型是一个包含 Java 类属性的 XML 复杂数据类型。我们可以通过 @XmlRootElement 注解的 name 属性来定制映射的 schema 全局元素的名称,一般来说以 @XmlRootElement 标注的类在相应的 XML 文档中会以最外层或根节点形式出现。 | |
@XmlElement 注解用于标注 Javabean 的属性,用它标注的属性在映射后的 schema 中以元素的形式出现,所有 Javabean 属性映射的元素组合成为 @XmlType 映射的复杂数据类型。我们可以通过 @XmlElement 注解的 name 属性定制映射后的 XML 元素的名称,用 required 属性来指定该元素是否必须出现,用 nillable 属性来指明该元素是否允许空值。 | |
用于控制字段或属性的序列化。 FIELD ,JAXB 绑定类中的每个非静态、非瞬态字段将会自动绑定到 XML NONE, 只有使用一些 JAXB 注释专门对它们进行注释的所有字段或属性才绑定到 XML。 PROPERTY, JAXB 绑定类中的每个获取方法/设置方法对将会自动绑定到 XML。 PUBLIC_MEMBER, 每个公共获取方法/设置方法对和每个公共字段将会自动绑定到 XML。 | |
@XmlType 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中中会以一个 XML 复杂数据类型的形式出现。可以通过 @XmlType 注解的 name 属性来定制映射的 XML 数据类型的名称,用 propOrder 属性来定制映射后的复杂数据类型的内容顺序等。 | |
@XmlElement 注解用于标注 Javabean 的属性,用它标注的属性在映射后的 schema 中以元素的形式出现,所有 Javabean 属性映射的元素组合成为 @XmlType 映射的复杂数据类型。我们可以通过 @XmlElement 注解的 name 属性定制映射后的 XML 元素的名称,用 required 属性来指定该元素是否必须出现,用 nillable 属性来指明该元素是否允许空值。 | |
@XmlTransient表明当前字段不用映射成为xml的属性 | |
@XmlAttribute 注解用于标注 Javabean 属性,用它标注的属性在映射后的 schema 中以元素属性形式表现。我们可以通过 @XmlAttribute 注解的 name 属性来定制映射后的名称,用 required 属性来指定是否映射后的属性为必须出现的。 | |
使用这两个主要是为了那种 xml data type无法映射为Java object而准备的,比如Collection和Map及实现类等。 例:@XmlJavaTypeAdapter(AdapterPurchaseListToHashMap.class)// 使用自定义的实现 XmlAdapter 接口的适配器 for custom marshaling。 |
对于基本类型(如int, long, double, string),不需要添加任何的annotation就可以进行把java data type映射到web service schema data type,即使是自定义的class来包装基本类型也不需要添加任何的annotation就可以进行把java data type映射到web service schema data type。
但总是有一些特殊的data type,如
1. BigDecimal Type
2. java.net.URI Type
3. Duration
4. Binary Types
5. XMLGregorianCalendar Type
6. UUID Type
7. Typed Variables
8. Collections Types
9. Array Types
10. Enum type
请参考:
² http://docs.sun.com/app/docs/doc/820-1072/ahigx?l=zh_TW&a=view
² http://www.ibm.com/developerworks/cn/webservices/1003_sunzg_jaxb/
具体请参考j2EE API是如下两个包:
² javax.xml.bind.annotation.adapters