Menu Close

35.3. 単純型からの複合型の派生

概要

Apache CXF は、複合型の単純型からの派生をサポートします。単純型の定義では、サブ要素や属性は含まれません。そのため、単純型から複合型を派生する主な理由の 1 つは、属性を単純型に追加することです。

単純型から複合型を派生する方法は 2 つあります。

エクステンションによる派生

例35.12「エクステンションによる単純型からの複合型の派生」に、currency 属性を追加するために、エクステンションにより xsd:decimal プリミティブ型から派生した複合型 internationalPrice の例を示します。

例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「制限による単純型からの複合型の派生」に、制限により xsd:string から派生した複合型 idType の例を示しています。定義される型は、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「エクステンションによる単純型からの複合型の派生」の場合のように、simpleContent 要素は新しい型に子が含まれていないことを示します。この例では、restriction 要素を使用して、新規型で使用できる値を制限します。attribute 要素は、新しい型に要素を追加します。

Java へのマッピング

単純型から派生する複合型は、@XmlType アノテーションが付けられた Java クラスにマッピングされます。生成されるクラスには、複合型が派生する単純型のメンバー変数 value が含まれます。メンバー変数には @XmlValue アノテーションが付けられます。クラスには、getValue() メソッドと setValue() メソッドも含まれます。さらに、生成されるクラスには、単純型を拡張する各属性について、メンバー変数ならびに関連するジッターおよびセッターメソッドが含まれます。

例35.14「idType Java クラス」に、例35.13「制限による単純型からの複合型の派生」で定義される idType 型に生成される Java クラスを示します。

例35.14 idType Java クラス

@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;
    }

}