35.3. 从简单类型分离复杂类型

概述

Apache CXF 支持从简单类型分离复杂类型。简单类型具有定义,但不定义 sub-elements 或 属性。因此,从简单类型分离复杂类型的主要原因之一就是将属性添加到简单类型。

从简单类型分离复杂类型的方法有两种:

按扩展进行 Derivation

例 35.12 “从简单类型分离复杂类型(按扩展扩展)” 展示了复杂类型 国际Price 的示例,它通过 xsd:decimal primitive 类型的扩展来包括货币属性。

例 35.12. 从简单类型分离复杂类型(按扩展扩展)

<complexType name="internationalPrice">
    <simpleContent>
        <extension base="xsd:decimal">
            <attribute name="currency" type="xsd:string"/>
        </extension>
    </simpleContent>
    </complexType>

simpleContent 元素表示新类型不包含任何子元素。extension 元素指定新类型扩展 xsd:decimal

根据限制进行调度

例 35.13 “从简单类型划分中分离复杂类型” 显示复杂类型 idType 的示例,它根据 xsd:string 的限制进行生成。定义的类型将 xsd:string的可能值限制为长度为 10 个字符的值。它还在类型中添加属性。

例 35.13. 从简单类型划分中分离复杂类型

<complexType name="idType">
  <simpleContent>
    <restriction base="xsd:string">
     <length value="10" />
     <attribute name="expires" type="xsd:dateTime" />
    </restriction>
  </simpleContent>
</complexType>

与在 例 35.12 “从简单类型分离复杂类型(按扩展扩展)” 中一样,新类型不包含任何子项 的简单内容 元素信号。本例使用 limit 元素 来限制新类型中使用的可能值。attribute 元素将元素添加到新类型。

映射到 Java

从简单类型派生的复杂类型映射到使用 @XmlType 注释进行解码的 Java 类。生成的类包含派生复杂类型的简单类型的成员变量 value。member 变量使用 @XmlValue 注释进行解码。类也具有 getValue() 方法和 setValue() 方法。此外,生成的类具有 member 变量,以及每个扩展简单类型的属性的 getter 和 setter 方法。

例 35.14 “idType Java Class” 显示 例 35.13 “从简单类型划分中分离复杂类型” 中定义的 idType 类型生成的 Java 类。

例 35.14. idType Java Class

@XmlType(name = "idType", propOrder = {
    "value"
})
public class IdType {

    @XmlValue
    protected String value;
    @XmlAttribute
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar expires;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public XMLGregorianCalendar getExpires() {
        return expires;
    }

    public void setExpires(XMLGregorianCalendar value) {
        this.expires = value;
    }

}