第 38 章 自定义如何生成类型
摘要
默认 JAXB 映射解决使用 XML Schema 定义 Java 应用对象时遇到的大多数情况。对于默认映射不足的实例,JAXB 提供了广泛的自定义机制。
38.1. 自定义类型映射的基础知识
概述
JAXB 规范定义了多个 XML 元素,用于自定义 Java 类型如何映射到 XML Schema 结构。这些元素可以通过 XML Schema 构造来指定。如果您无法或者不想修改 XML Schema 定义,您可以在外部绑定文档中指定自定义。
命名空间
用于自定义 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
属性添加到外部绑定声明的 root 元素来实现。如果您使用的是在线自定义,则必须在包含自定义的 schema
元素中包含 jaxb:version
属性。属性的值始终是 2.0
。
例 38.2 “指定 JAXB 自定义版本” 显示 架构
元素中使用的 jaxb:version
属性的示例。
例 38.2. 指定 JAXB 自定义版本
< schema ... jaxb:version="2.0">
使用在线自定义
自定义代码生成器的最直接方法是自定义 XML Schema 构造到 Java 构造,将自定义元素直接添加到 XML Schema 定义中。JAXB 自定义元素放在被修改的 XML 架构结构的 xsd:appinfo
元素中。
例 38.3 “自定义 XML Schema” 显示包含在线 JAXB 自定义的 schema 示例。
例 38.3. 自定义 XML Schema
<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 Schema 文档进行修改时,您可以使用外部绑定声明指定自定义。外部绑定声明由多个嵌套的 jaxb:bindings
元素组成。例 38.4 “JAXB External Binding Declaration 语法” 显示外部绑定声明的语法。
例 38.4. JAXB External Binding Declaration 语法
<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 语句。
由于架构文档 widgetSchema.xsd
显示在 例 38.5 “XML Schema 文件” 中,则 例 38.6 “外部绑定声明” 中显示的外部绑定声明会修改复杂类型 大小的
生成。
例 38.5. XML Schema 文件
<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>
要指示代码生成器,使用 wsdl2java
工具的 -b binding-file
选项,如下所示:
wsdl2java -b widgetBinding.xml widget.wsdl