Red Hat Training
A Red Hat training course is available for Red Hat Fuse
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要素を使用して定義されている場合は、「選択要素の発生制約」 を参照してください。