第 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