第 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