Menu Close
35.6. モデルグループの使用
概要
XML スキーマのモデルグループは、ユーザー定義の複合型から要素のグループを参照できる便利なショートカットです。たとえば、アプリケーションの複数の型に共通する要素のグループを定義し、グループを繰り返し参照することができます。モデルグループは group
要素を使用して定義され、複合型の定義に似ています。モデルグループから Java へのマッピングも、複合型のマッピングに似ています。
XML スキーマでのモデルグループの定義
group
要素と name
属性を使用して、XML スキーマでモデルグループを定義します。name
属性の値は、スキーマ全体でグループを参照するのに使用される文字列です。complexType
要素などの group
要素は、直接の子要素としてsequence
要素、all
要素、または choice
要素を持つことができます。
子要素内で、element
要素を使用してグループのメンバーを定義します。グループのメンバーごとに、1 つの element
要素を指定します。グループメンバーは、minOccurs
や maxOccurs
を含む 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>
型定義でのモデルグループの使用
モデルグループを定義したら、複合型定義の一部として使用できます。複合型の定義でモデルグループを使用するには、group
要素と ref
属性を使用します。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>
オブジェクトは、グループの最初の子のルールに従って生成されます。
-
グループが
sequence
要素を使用して定義されている場合は、「シーケンスでの発生の制約」を参照してください。 -
グループが
choice
要素を使用して定義されている場合は、「choice 要素での発生の制約」を参照してください。