第 38 章 自定义如何生成类型
摘要
默认的 JAXB 映射解决了使用 XML 架构定义 Java 应用的对象时遇到的大部分情况。对于默认映射不足的实例,JAXB 提供了广泛的自定义机制。
38.1. 自定义类型映射的基础知识 复制链接链接已复制到粘贴板!
概述 复制链接链接已复制到粘贴板!
JAXB 规范定义了多个 XML 元素,它们自定义 Java 类型映射到 XML 架构结构的方式。这些元素可以在线使用 XML 架构结构指定。如果无法或不想修改 XML 架构定义,您可以在外部绑定文档中指定自定义。
命名空间 复制链接链接已复制到粘贴板!
用于自定义 JAXB 数据绑定的元素在命名空间 http://java.sun.com/xml/ns/jaxb 中定义。您必须添加与 例 38.1 “JAXB 自定义命名空间” 中显示的命名空间声明。这添加到定义 JAXB 自定义的所有 XML 文档的根元素中。
例 38.1. JAXB 自定义命名空间
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
版本声明 复制链接链接已复制到粘贴板!
在使用 JAXB 自定义时,您必须指明正在使用的 JAXB 版本。这可以通过在外部绑定声明的根元素中添加 jaxb:version 属性来实现。如果使用 in-line 自定义,则必须在包含自定义的 schema 元素中包含 jaxb:version 属性。属性的值始终为 2.0。
例 38.2 “指定 JAXB 自定义版本” 显示 schema 元素中使用的 jaxb:version 属性示例。
例 38.2. 指定 JAXB 自定义版本
< schema ...
jaxb:version="2.0">
使用在线自定义 复制链接链接已复制到粘贴板!
自定义代码生成器如何将 XML 架构结构映射到 Java 构造的最直接方法是将自定义元素直接添加到 XML 架构定义中。JAXB 自定义元素放在被修改的 XML 架构结构的 xsd:appinfo 元素中。
例 38.3 “自定义 XML 架构” 显示包含在线 JAXB 定制的架构示例。
例 38.3. 自定义 XML 架构
<schema targetNamespace="http://widget.com/types/widgetTypes"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<complexType name="size">
<annotation> <appinfo> <jaxb:class name="widgetSize" /> </appinfo> </annotation>
<sequence>
<element name="longSize" type="xsd:string" />
<element name="numberSize" type="xsd:int" />
</sequence>
</complexType>
<schema>
使用外部绑定声明 复制链接链接已复制到粘贴板!
如果您无法或不想更改定义您的类型的 XML 架构文档,您可以使用外部绑定声明指定自定义。外部绑定声明由多个嵌套的 jaxb:bindings 元素组成。例 38.4 “JAXB External Binding Declaration Syntax” 显示外部绑定声明的语法。
例 38.4. JAXB External Binding Declaration Syntax
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
jaxb:version="2.0">
<jaxb:bindings [schemaLocation="schemaUri" | wsdlLocation="wsdlUri">
<jaxb:bindings node="nodeXPath">
binding declaration
</jaxb:bindings>
...
</jaxb:bindings>
<jaxb:bindings>
schemaLocation 属性和 wsdlLocation 属性用于识别修改要应用到的 schema 文档。如果您要从 schema 文档生成代码,请使用 schemaLocation 属性。如果您要从 WSDL 文档生成代码,请使用 wsdlLocation 属性。
node 属性用于识别要修改的特定 XML 模式结构。它是解析为 XML Schema 元素的 XPath 语句。
根据 例 38.5 “XML 架构文件” 中显示的架构文档 widgetSchema.xsd,例 38.6 “外部绑定声明” 中显示的外部绑定声明会修改复杂类型 大小的 生成。
例 38.5. XML 架构文件
<schema targetNamespace="http://widget.com/types/widgetTypes"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
version="1.0">
<complexType name="size">
<sequence>
<element name="longSize" type="xsd:string" />
<element name="numberSize" type="xsd:int" />
</sequence>
</complexType>
<schema>
例 38.6. 外部绑定声明
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
jaxb:version="2.0">
<jaxb:bindings schemaLocation="wsdlSchema.xsd">
<jaxb:bindings node="xsd:complexType[@name='size']">
<jaxb:class name="widgetSize" />
</jaxb:bindings>
</jaxb:bindings>
<jaxb:bindings>
要指示代码生成器使用外部 binging 声明,请使用 wsdl2java 工具的 -b binding-file 选项,如下所示:
wsdl2java -b widgetBinding.xml widget.wsdl