35.6. モデルグループの使用

概要

XML スキーマモデルグループは、ユーザー定義の複合型から要素のグループを参照できる便利なショートカットです。たとえば、アプリケーションの複数の型に共通する要素のグループを定義して、そのグループを繰り返し参照できます。モデルグループは group 要素を使用して定義され、複合型の定義に似ています。モデルグループの Java へのマッピングも、複合型のマッピングに似ています。

XML スキーマでのモデルグループの定義

group 要素と name 属性を使用して、XML スキーマでモデルグループを定義します。name 属性の値は、スキーマ全体でグループを参照するために使用される文字列です。group 要素は、complexType 要素と同様に、sequence 要素、all 要素、choice 要素を直接の子として持つことができます。

子要素内で、element 要素を使用してグループのメンバーを定義します。グループのメンバーごとに、1 つの element 要素を指定します。グループメンバーは、minOccursmaxOccurs など、element 要素の標準的な属性を使用することができます。そのため、グループに 3 つの要素があり、その 1 つが最大 3 回発生できる場合は、グループに 3 つの element 要素を定義し、そのうちの 1 つには maxOccurs="3" を使用します。例35.22「XML スキーマモデルグループ」 は、3 つの要素を持つモデルグループを示しています。

例35.22 XML スキーマモデルグループ

<group name="passenger">
  <sequence>
    <element name="name" type="xsd:string" />
    <element name="clubNum" type="xsd:long" />
    <element name="seatPref" type="xsd:string"
             maxOccurs="3" />
  </sequence>
</group>

タイプ定義でのモデルグループの使用

モデルグループが定義されると、それを複合型定義の一部として使用できます。コンプレックスタイプ定義でモデルグループを使用するには、ref 属性を指定して group 要素を使用します。ref 属性の値は、定義されたときにグループに指定された名前です。たとえば、例35.22「XML スキーマモデルグループ」 で定義されたグループを使用するには 例35.23「モデルグループを持つ複合型」 に示すように、<group ref="tns:passenger" /> を使用します。

例35.23 モデルグループを持つ複合型

<complexType name="reservation">
  <sequence>
    <group ref="tns:passenger" />
    <element name="origin" type="xsd:string" />
    <element name="destination" type="xsd:string" />
    <element name="fltNum" type="xsd:long" />
  </sequence>
</complexType>

モデルグループがタイプ定義で使用される場合、グループはタイプのメンバーになります。したがって、reservation のインスタンスには 4 つのメンバー要素があります。最初の要素は passenger 要素で、例35.22「XML スキーマモデルグループ」 に示すグループで定義されるメンバー要素が含まれます。reservation のインスタンスの例は、例35.24「モデルグループを持つタイプのインスタンス」 に記載されています。

例35.24 モデルグループを持つタイプのインスタンス

<reservation>
  <passenger> <name>A. Smart</name> <clubNum>99</clubNum> <seatPref>isle1</seatPref> </passenger>
  <origin>LAX</origin>
  <destination>FRA</destination>
  <fltNum>34567</fltNum>
</reservation>

Java へのマッピング

デフォルトでは、モデルグループは、複合型定義に含まれている場合にのみ Java アーティファクトにマップされます。モデルグループを含む複合型のコードを生成する場合、Apache CXF は、モデルグループのメンバー変数をその型用に生成された Java クラスに含めるだけです。モデルグループを表すメンバー変数には、モデルグループの定義に基づいてアノテーションが付けられます。

例35.25「グループで入力する」に、例35.23「モデルグループを持つ複合型」 で定義される複合型に生成される Java クラスを示します。

例35.25 グループで入力する

@XmlType(name = "reservation", propOrder = {
    "name",
    "clubNum",
    "seatPref",
    "origin",
    "destination",
    "fltNum"
})
public class Reservation {

    @XmlElement(required = true)
    protected String name;
    protected long clubNum;
    @XmlElement(required = true)
    protected List<String> seatPref;
    @XmlElement(required = true)
    protected String origin;
    @XmlElement(required = true)
    protected String destination;
    protected long fltNum;

    public String getName() {
        return name;
    }

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

    public long getClubNum() {
        return clubNum;
    }

    public void setClubNum(long value) {
        this.clubNum = value;
    }

    public List<String> getSeatPref() {
        if (seatPref == null) {
            seatPref = new ArrayList<String>();
        }
        return this.seatPref;
    }

    public String getOrigin() {
        return origin;
    }

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

    public String getDestination() {
        return destination;
    }

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

    public long getFltNum() {
        return fltNum;
    }

    public void setFltNum(long value) {
        this.fltNum = value;
    }

複数回発生

group 要素の maxOccurs 属性を 1 より大きい値に設定すると、モデルグループが複数回表示されるように指定できます。Apache CXF がモデルグループを複数発生できるようにするには、モデルグループを List<T> オブジェクトにマッピングします。List<T> オブジェクトは、グループの最初の子のルールに従って生成されます。