CXF详解三

CXFJAXB

通常情况下我们不直接传对象,因为直接传递对象安全性差,而且暴露了实体对象。所以我们选择传递XML文件,当然也可以传递JSON对象。对于传递XMLJAX-WS采用的是JAXB工具。

JAXBJava Architecture for XML Binding)提供了一个快速而方便的方式绑定XML Schemasjava,使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 Mappinghere list the mapping of Java classes to XML data types):在Java EE5 中的JAXB注解元素在 javax.xml.bind.annotation包中。

JAXB annotation

XmlRootElement

@XmlRootElement 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中会以一个全局元素的形式出现,元素的类型是一个包含 Java 类属性的 XML 复杂数据类型。我们可以通过 @XmlRootElement 注解的 name 属性来定制映射的 schema 全局元素的名称,一般来说以 @XmlRootElement 标注的类在相应的 XML 文档中会以最外层或根节点形式出现。

XmlAccessorType

@XmlElement 注解用于标注 Javabean 的属性,用它标注的属性在映射后的 schema 中以元素的形式出现,所有 Javabean 属性映射的元素组合成为 @XmlType 映射的复杂数据类型。我们可以通过 @XmlElement 注解的 name 属性定制映射后的 XML 元素的名称,用 required 属性来指定该元素是否必须出现,用 nillable 属性来指明该元素是否允许空值。

XmlAccessType

用于控制字段或属性的序列化。

FIELD JAXB 绑定类中的每个非静态、非瞬态字段将会自动绑定到 XML

NONE 只有使用一些 JAXB 注释专门对它们进行注释的所有字段或属性才绑定到 XML

PROPERTY, JAXB 绑定类中的每个获取方法/设置方法对将会自动绑定到 XML

PUBLIC_MEMBER, 每个公共获取方法/设置方法对和每个公共字段将会自动绑定到 XML

XmlType

@XmlType 注解用于标注类或枚举类型,用它标注的类在映射后的 schema 中中会以一个 XML 复杂数据类型的形式出现。可以通过 @XmlType 注解的 name 属性来定制映射的 XML 数据类型的名称,用 propOrder 属性来定制映射后的复杂数据类型的内容顺序等。

XmlElement

@XmlElement 注解用于标注 Javabean 的属性,用它标注的属性在映射后的 schema 中以元素的形式出现,所有 Javabean 属性映射的元素组合成为 @XmlType 映射的复杂数据类型。我们可以通过 @XmlElement 注解的 name 属性定制映射后的 XML 元素的名称,用 required 属性来指定该元素是否必须出现,用 nillable 属性来指明该元素是否允许空值。

XmlTransient

@XmlTransient表明当前字段不用映射成为xml的属性

XmlAttribute

@XmlAttribute 注解用于标注 Javabean 属性,用它标注的属性在映射后的 schema 中以元素属性形式表现。我们可以通过 @XmlAttribute 注解的 name 属性来定制映射后的名称,用 required 属性来指定是否映射后的属性为必须出现的。

XmlJavaTypeAdapter

XmlAdapter

使用这两个主要是为了那种 xml data type无法映射为Java object而准备的,比如CollectionMap及实现类等。

例:@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

10Enum 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

²  javax.xml.bind.annotation.adapters

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值