38.6. 指定元素或属性的 Base Type
概述
有时您需要自定义为元素生成的对象的类,或者针对定义为 XML Schema 复杂类型的一部分定义的属性。例如,您可能希望使用更为常规化的对象类,以便进行简单替换。
其中一种实现方式是使用 JAXB 基础类型自定义。它允许开发人员以防范的方式指定生成的对象类,以代表元素或属性。基础类型自定义允许您指定 XML Schema 结构和生成的 Java 对象之间的备用映射。这个备用映射可以是一个简单的分类,也可以是默认基础类的一般性。它还可以是 XML Schema 原语类型到 Java 类的映射。
自定义使用
要将 JAXB 基础类型属性应用到 XML Schema 结构,请使用 JAXB baseType
自定义元素。baseType
自定义元素是 JAXB 属性
元素的子项,所以它必须正确嵌套。
根据您要自定义 XML Schema 构造到 Java 对象的映射,您要添加 baseType
自定义元素 的名称
属性或 javaType
子元素。name
属性用于将生成的对象的 default 类映射到同一类层次结构中的另一个类。当您将 XML Schema 原语类型映射到 Java 类时,使用 javaType
元素。
您不能在同一 baseType
自定义元素中使用 name
属性和 javaType
子元素。
特殊大小或常规默认映射
baseType
自定义元素的 name
属性用于将生成的对象的类重新定义为同一 Java 类层次结构中的类。属性指定 XML Schema 结构映射到的 Java 类的完全限定名称。指定的 Java 类 必须是 超级类或 Java 类的子类,这些代码生成器通常会为 XML Schema 结构生成。对于映射到 Java 原语类型的 XML 方案,打包程序类用作自定义用途的默认基础类。
例如,定义为 xsd:int
的元素使用 java.lang.Integer
作为其默认基础类。name
属性的值可以指定任何一类 Integer
,如 Number
或 Object
。
对于简单类型替换,最常见的自定义是将原语类型映射到对象对象。
例 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 Schema 原语类型,类是对应 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 Schema 原语类型定义的元素和属性如何映射到 Java 对象。使用 javaType
元素提供更大的灵活性,而不仅仅是使用 baseType
元素的 name
属性。javaType
元素允许您将原语类型映射到任何对象的类。
有关使用 javaType
元素的详细描述,请参阅 第 38.2 节 “指定 XML Schema 原语的 Java 类”。