35.3. 从简单类型派生复杂类型

概述

Apache CXF 支持从简单类型派生复杂类型。根据定义,一个简单的类型没有子元素或属性。因此,从简单类型派生复杂类型的主要原因是将属性添加到简单类型。

从一个简单的类型派生复杂类型的方法有两种:

按扩展进行派生

例 35.12 “根据扩展从简单类型派生复杂类型” 显示了从 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 “通过 Restriction 从简单类型派生复杂类型” 显示了一个复杂类型 idType 的示例,它由来自 xsd:string 限制派生。定义的类型将 xsd:string的可能值限制为长度为十个字符的值。它还向类型添加一个属性。

例 35.13. 通过 Restriction 从简单类型派生复杂类型

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

例 35.12 “根据扩展从简单类型派生复杂类型” 一样,simpleContent 元素表示新类型不包含任何子项。这个示例使用 Limit 元素 来限制新类型中使用的可能值。attribute 元素将元素添加到新类型。

映射到 Java

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

例 35.14 “idType Java Class” 显示为 例 35.13 “通过 Restriction 从简单类型派生复杂类型” 中定义的 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;
    }

}