第 38 章 自定义类型是如何生成方式
摘要
默认的 JAXB 映射地址使用 XML 架构为 Java 应用定义对象时遇到的大部分情况。对于默认映射不足的实例,CIB 提供广泛的自定义机制。
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 属性来实现。如果您使用在线自定义,则必须在包含自定义的 schema 元素中包含 jaxb:version 属性。该属性的值始终为 2.0。
例 38.2 “指定 JAXB 自定义版本” 显示 schema 元素中使用的 jaxb:version 属性示例。
例 38.2. 指定 JAXB 自定义版本
< schema ...
jaxb:version="2.0">
使用在线自定义 复制链接链接已复制到粘贴板!
自定义代码生成器映射 XML 架构结构的最直接方法是将自定义元素直接添加到 XML 架构定义中。JAXB 自定义元素放置在被修改的 XML 架构结构的 xsd:appinfo 元素中。
例 38.3 “自定义 XML 架构” 演示了一个含有内 JAXB 自定义的 schema 示例。
例 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 外部网络声明语法” 显示外部绑定声明的语法。
例 38.4. JAXB 外部网络声明语法
<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 文档生成代码,请使用 schemaLocation 属性。如果您要从 WSDL 文档生成代码,请使用 wsdlLocation 属性。
node 属性用于识别要修改的特定 XML 架构结构。它是解析为 XML 架构元素的 XPath 语句。
根据架构文档 widgetSchema.xsd (如 例 38.5 “XML 架构文件” 所示),例 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>
要指示代码生成器使用外部 bing 声明,请使用 wsdl2java 工具的 -b binding-file 选项,如下所示:
wsdl2java -b widgetBinding.xml widget.wsdl