第 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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.