35.6. モデルグループの使用
概要
XML スキーマモデルグループは、ユーザー定義の複合型から要素のグループを参照できる便利なショートカットです。たとえば、アプリケーションの複数の型に共通する要素のグループを定義して、そのグループを繰り返し参照できます。モデルグループは group
要素を使用して定義され、複合型の定義に似ています。モデルグループの Java へのマッピングも、複合型のマッピングに似ています。
XML スキーマでのモデルグループの定義
group
要素と name
属性を使用して、XML スキーマでモデルグループを定義します。name
属性の値は、スキーマ全体でグループを参照するために使用される文字列です。group
要素は、complexType
要素と同様に、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>
タイプ定義でのモデルグループの使用
モデルグループが定義されると、それを複合型定義の一部として使用できます。コンプレックスタイプ定義でモデルグループを使用するには、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>
オブジェクトは、グループの最初の子のルールに従って生成されます。
-
グループが
sequence
要素を使用して定義される場合は、「シーケンスの発生制約」 を参照してください。 -
グループが
choice
要素を使用して定義されている場合は、「選択要素の発生制約」 を参照してください。