35.4. 从复杂类型推断复杂类型
概述
使用 XML Schema 时,您可以通过使用 complexContent
元素扩展或限制其他复杂类型来产生新的复杂类型。在生成 Java 类来表示派生的复杂类型时,Apache CXF 扩展基本类型类。这样,生成的 Java 代码会保留 XML Schema 中预期的继承层次结构。
模式语法
您可以使用 复杂的Content
元素以及 extension
元素或限制元素,从其他复杂类型衍生复杂类型。complexContent
元素指定包含的数据描述包含多个字段。extension
元素和 restricted
元素(即 复杂Content
元素的子元素)指定被修改的基本类型,以创建新类型。基础类型由 base
属性指定。
扩展复杂类型
要扩展复杂类型,请使用 extension
元素来定义组成新类型的附加元素和属性。在复杂类型描述中允许的所有元素都作为新类型定义的一部分是允许的。例如,您可以在新类型中添加匿名枚举,或者
您可以使用 choice 元素指定一次只能使用其中一个新字段。
例 35.15 “通过扩展来划分复杂度类型” 显示 XML Schema 片段,它定义了两个复杂的类型,即 widgetOrderInfo
和 widgetOrderBillInfo
。widgetOrderBillInfo
通过扩展 widgetOrderInfo
来包括两个新元素: orderNumber
和 amtDue
。
例 35.15. 通过扩展来划分复杂度类型
<complexType name="widgetOrderInfo"> <sequence> <element name="amount" type="xsd:int"/> <element name="order_date" type="xsd:dateTime"/> <element name="type" type="xsd1:widgetSize"/> <element name="shippingAddress" type="xsd1:Address"/> </sequence> <attribute name="rush" type="xsd:boolean" use="optional" /> </complexType> <complexType name="widgetOrderBillInfo"> <complexContent> <extension base="xsd1:widgetOrderInfo"> <sequence> <element name="amtDue" type="xsd:decimal"/> <element name="orderNumber" type="xsd:string"/> </sequence> <attribute name="paid" type="xsd:boolean" default="false" /> </extension> </complexContent> </complexType>
限制复杂类型
若要限制复杂类型,可使用 limit 元素来限制基本类型的元素或属性的可能值。在限制复杂类型时,您必须列出基本类型的所有元素和属性。对于每个元素,您可以在定义中添加限制性属性。例如,您可以将
maxOccurs
属性添加到元素中,以限制其可以发生的次数。您还可以使用 fixed
属性来强制一个或多个元素具有预先确定的值。
例 35.16 “根据限制定义紧急类型” 显示通过限制其他复杂类型来定义复杂类型的示例。受限类型 wallawallaAddress
只能用于 Walla Walla、Washington 中的地址,因为 城市
元素的值、州
元素和 zipCode
元素被修复。
例 35.16. 根据限制定义紧急类型
<complexType name="Address"> <sequence> <element name="name" type="xsd:string"/> <element name="street" type="xsd:short" maxOccurs="3"/> <element name="city" type="xsd:string"/> <element name="state" type="xsd:string"/> <element name="zipCode" type="xsd:string"/> </sequence> </complexType> <complexType name="wallawallaAddress"> <complexContent> <restriction base="xsd1:Address"> <sequence> <element name="name" type="xsd:string"/> <element name="street" type="xsd:short" maxOccurs="3"/> <element name="city" type="xsd:string" fixed="WallaWalla"/> <element name="state" type="xsd:string" fixed="WA" /> <element name="zipCode" type="xsd:string" fixed="99362" /> </sequence> </restriction> </complexContent> </complexType>
映射到 Java
与所有复杂的类型一样,Apache CXF 生成类来代表来自另一个复杂类型的复杂类型。为派生复杂类型生成的 Java 类扩展了生成的 Java 类来支持基础复杂类型。基本 Java 类也被修改为包含 @XmlSeeAlso
注释。基本类的 @XmlSeeAlso
注释列出了扩展基本类的所有类。
当根据扩展名派生了新的复杂类型时,生成的类将包含所有添加元素和属性的成员变量。新成员变量将根据与所有其他元素相同的映射生成。
当根据限制派生了新的复杂类型时,生成的类将没有新的成员变量。生成的类只是一个不提供任何额外功能的 shell。完全允许您确保强制使用 XML Schema 中定义的限制。
例如,例 35.15 “通过扩展来划分复杂度类型” 中的架构生成两个 Java 类的生成: WidgetOrderInfo
和 WidgetBillOrderInfo
。WidgetOrderBillInfo
扩展 WidgetOrderInfo
,因为 widgetOrderBillInfo
由 widgetOrderInfo
进行扩展。例 35.17 “WidgetOrderBillInfo” 显示为 widgetOrderBillInfo
生成的类。
例 35.17. WidgetOrderBillInfo
@XmlType(name = "widgetOrderBillInfo", propOrder = { "amtDue", "orderNumber" }) public class WidgetOrderBillInfo extends WidgetOrderInfo { @XmlElement(required = true) protected BigDecimal amtDue; @XmlElement(required = true) protected String orderNumber; @XmlAttribute protected Boolean paid; public BigDecimal getAmtDue() { return amtDue; } public void setAmtDue(BigDecimal value) { this.amtDue = value; } public String getOrderNumber() { return orderNumber; } public void setOrderNumber(String value) { this.orderNumber = value; } public boolean isPaid() { if (paid == null) { return false; } else { return paid; } } public void setPaid(Boolean value) { this.paid = value; } }