38.6. 指定 Element 或属性的基本类型

概述

有时,您需要自定义为元素生成的对象的类,或用于定义为 XML 架构复杂类型一部分定义的属性。例如,您可能希望使用更常规的对象的类来代替简单类型。

执行此操作的一种方法是使用 JAXB 基础类型自定义。它在运行时允许开发人员指定生成的对象类,以表示元素或属性。通过基础类型自定义,您可以指定 XML 架构结构和生成的 Java 对象之间的备用映射。这个备用映射可以是简单的分类,也可以是默认的基础类的一般类别。它也可以是到 Java 类的 XML 架构原始类型的映射。

定制使用

要将 JAXB 基础类型属性应用到 XML Schema 结构,请使用 JAXB baseType 自定义元素。baseType custom 元素是 JAXB 属性 元素的子项,因此必须正确嵌套。

根据您要如何为 Java 对象定制 XML 架构结构映射,添加 baseType 自定义元素的 name 属性,或 javaType 子元素。name 属性用于将生成的对象的 default 类映射到同一类层次结构中的另一类。您希望将 XML 架构原语类型映射到 Java 类时,将使用 javaType 元素。

重要

您不能在同一 baseType 自定义元素中使用 name 属性和 javaType 子元素。

专用或常规默认映射

baseType custom 元素的 name 属性用于将生成的对象的类重新定义为同一 Java 类层次结构中的类。该属性指定将 XML 架构结构映射到的 Java 类的完全限定名称。指定的 Java 类 必须是 超级类或 Java 类的子类,代码生成器通常为 XML 架构结构生成。对于映射到 Java 原语类型的 XML 架构原语类型,打包程序类用作自定义目的的默认基础类。

例如,定义为 xsd:int 的元素使用 java.lang.Integer 作为其默认存储类。name 属性的值可以指定任何 Integer 的超类,如 NumberObject

对于简单类型替换,最常见的自定义是将原语类型映射到对象对象。

例 38.27 “基本类型的在线自定义” 显示行自定义,它将复杂类型中的一个元素映射到 Java 对象对象。

例 38.27. 基本类型的在线自定义

<complexType name="widgetOrderInfo">
  <all>
    <element name="amount" type="xsd:int" />
     <element name="shippingAdress" type="Address">
      <annotation> <appinfo> <jaxb:property> <jaxb:baseType name="java.lang.Object" /> </jaxb:property> </appinfo> </annotation>
    </element>
    <element name="type" type="xsd:string"/>
  </all>
</complexType>

例 38.28 “用于自定义基本类型的外部绑定文件” 显示 例 38.27 “基本类型的在线自定义” 中显示的自定义外部绑定文件。

例 38.28. 用于自定义基本类型的外部绑定文件

<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="enumMap.xsd">
    <jaxb:bindings node="xsd:ComplexType[@name='widgetOrderInfo']">
      <jaxb:bindings node="xsd:element[@name='shippingAddress']">
        <jaxb:property>
          <jaxb:baseType name="java.lang.Object" />
        </jaxb:property>
      </jaxb:bindings>
    </jaxb:bindings>
  </jaxb:bindings>
<jaxb:bindings>

生成的 Java 对象的 @XmlElement 注释包含一个 type 属性。type 属性的值是代表生成对象的默认基础类型的类对象。如果是 XML 架构原语类型,该类是对应的 Java 原语类型的打包程序类。

例 38.29 “带有修改的基本类的 Java 类” 显示基于 例 38.28 “用于自定义基本类型的外部绑定文件” 中的 schema 定义生成的类。

例 38.29. 带有修改的基本类的 Java 类

public class WidgetOrderInfo {

    protected int amount;
    @XmlElement(required = true)
    protected String type;
    @XmlElement(required = true, type = Address.class) protected Object shippingAddress;

    ...
    public Object getShippingAddress() {
        return shippingAddress;
    }

    public void setShippingAddress(Object value) {
        this.shippingAddress = value;
    }

}

使用 javaType 的用法

javaType 元素可用于自定义如何使用 XML 架构原语类型定义元素和属性到 Java 对象。使用 javaType 元素提供比仅使用 baseType 元素的 name 属性更多的灵活性。javaType 元素允许您将 primitive 类型映射到任何类对象。

有关使用 javaType 元素的详细描述,请参阅 第 38.2 节 “指定 XML 架构 Primitive 的 Java 类”