第 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