第 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