34.6. simple Type Substitution

概述

XML 允许使用 xsi:type 属性在兼容类型之间进行简单替换。但是,简单类型的默认映射到 Java 原语类型的映射并不完全支持简单类型替换。运行时可以处理基本简单的类型替换,但信息会丢失。可以自定义代码生成器来生成 Java 类,从而促进无人简单的类型替换。

默认映射和过滤

因为 Java 原语类型不支持类型替换,所以使用简单类型到 Java 原语类型的默认映射提供了支持简单类型替换的问题。如果尝试将一个 简短 传递给某个变量的变量,那么 Java 虚拟机将会 balk,即使定义了类型允许该类型的架构也是如此。

要了解 Java 类型系统的限制,Apache CXF 在元素的 xsi:type 属性的值满足以下条件之一时,允许进行简单的类型替换:

  • 它指定一个原始类型,与元素的 schema 类型兼容。
  • 它指定一个类型,根据元素的 schema 类型进行限制。
  • 它指定一个复杂的类型,它通过元素的模式类型扩展来派生。

当运行时进行类型替换时,它不会保留元素 xsi:type 属性中指定的类型的任何知识。如果类型替换是从复杂的类型到简单类型,则只保留与简单类型直接相关的值。由扩展添加的任何其他元素和属性都会丢失。

支持无损类型替换

您可以自定义生成简单的类型,以便通过以下方法使无链接支持简单类型替换:

  • globalBindings 自定义元素的 mapSimpleTypeDef 设置为 true

    这指示代码生成器为全局范围中定义的所有简单类型创建 Java 值类。

    更多信息请参阅 第 38.3 节 “为简单类型生成 Java 类”

  • globalBindings 自定义元素中添加 javaType 元素。

    这指示代码生成器将 XML Schema 原语类型的所有实例映射到特定的类对象。

    更多信息请参阅 第 38.2 节 “指定 XML Schema 原语的 Java 类”

  • 在您要自定义的特定元素中添加 baseType 自定义元素。

    通过 baseType 自定义元素,您可以指定生成的 Java 类型来代表属性。为确保简单类型替换的最佳兼容性,请使用 java.lang.Object 作为基本类型。

    更多信息请参阅 第 38.6 节 “指定元素或属性的 Base Type”