構造体型
構造体型は、任意の数のデータ(メンバと呼びます)をpublicインスタンスフィールドとして持つデータ型です。メンバは、サポートされているデータ型であれば自由に定義できます。
構造体型と、それに対応してXMLで使用される型を以下に示します。
Webサービスアプリケーションのパラメタに使用するJavaのデータ型 | XMLで使用されるデータ型 |
---|---|
構造体型として定義した任意のクラス | 構造体 |
構造体型は、次の条件を満たすpublicクラスとして定義します。
各メンバをpublicインスタンスフィールドとして持つ(transientまたはfinal修飾されていないこと)
publicインスタンスフィールドのデータ型は、すべてサポートされているデータ型である
publicデフォルトコンストラクタを持つ
java.rmi.Remoteインタフェースをimplementsしていない
例
構造体型として定義したクラスの例
package com.example; // パッケージ名 public class Person { public String name; // 各メンバをpublicインスタンスフィールドとして宣言する public int age; // 同上 public Person (){ // public デフォルト(引数なし)コンストラクタ name="nobody"; age=0; } public Person (String myname, int myage){ // publicコンストラクタ(省略可) name = myname; age = myage; } }
上記のJavaに対応する、XMLの構造体のWSDL定義例を以下に示します。
<xsd:complexType name="Person"> <xsd:sequence> <xsd:element name="age" type="xsd:int"/> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> </xsd:complexType>
注意
publicインスタンスフィールドで定義するメンバのほかに、Bean型と同様にset/getメソッドを提供することでもメンバを定義することもできます。この場合、set/getメソッドで定義するメンバと、publicインスタンスフィールドで定義するメンバで、メンバ名(プロパティ名)が重ならない様に定義してください。メンバ名(プロパティ名)の違いは、大文字小文字のみの違いではなく、スペルが異なる様に定義してください。
構造体型がBean型や他の構造体型を継承しており、構造体型とそのスーパークラスの両方で同じ名前のpublicインスタンスフィールドが宣言されている場合、WSDLの生成やSOAP通信には、スーパークラスで宣言されたフィールドのみが使用されます。
Javaのクラスではメンバの順番が保障されません。そのためiswsgen wsdlコマンドは、JavaからWSDLを生成する際に、メンバを名前順に並べ替えることでWSDL上でメンバの順番の一貫性を保ちます。
Bean型
Bean型は、任意の数のデータ(メンバと呼びます)をプロパティとして持つ、構造体に類似したデータ型です。メンバは、サポートされているデータ型であれば自由に定義できます。
Bean型では、set/getメソッドを提供することでメンバを定義します。
Bean型と、それに対応してXMLで使用される型を以下に示します。
Webサービスアプリケーションのパラメタに使用するJavaのデータ型 | XMLで使用されるデータ型 |
---|---|
Bean型として定義した任意のクラス | 構造体 |
Bean型は、次の条件を満たすpublicクラスとして定義します。
各メンバをインスタンスのプロパティ(set/getメソッドのペア)として持つ
インスタンスのプロパティ(set/getメソッドのペア)のデータ型は、すべてサポートされているデータ型である
publicデフォルトコンストラクタを持つ
java.rmi.Remoteインタフェースをimplementsしていない
例
Bean型の定義例
package com.example; // パッケージ名 public class PersonBean { // 各メンバをプロパティ(set/getメソッドのペア)として宣言する private String _name;//privateのため、メンバとして直接参照されない public void setName(String name) { _name = name; } public String getName() { return _name; } // 同上 private int _age; //privateのため、メンバとして直接参照されない public void setAge(int age) { _age = age; } public int getAge() { return _age; } public PersonBean() { // public デフォルト(引数なし)コンストラクタ _name="nobody"; _age = 0; } public PersonBean(String name, int age){ // publicコンストラクタ(省略可) _name=name; _age=age; } }
上記のJavaに対応する、XMLの構造体のWSDL定義例を以下に示します。
<xsd:complexType name="Person"> <xsd:sequence> <xsd:element name="age" type="xsd:int"/> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> </xsd:complexType>
注意
set/getメソッドで定義するメンバのほかに、構造体と同様にpublicインスタンスフィールドを提供することでもメンバを定義することもできます。この場合、set/getメソッドで定義するメンバと、publicインスタンスフィールドで定義するメンバで、メンバ名(プロパティ名)が重ならない様に定義してください。メンバ名(プロパティ名)の違いは、大文字小文字のみの違いではなく、スペルが異なる様に定義してください。
Bean型が他のBean型や構造体型を継承しており、Bean型とそのスーパークラスの両方で同じ名前のpublicインスタンスフィールドが宣言されている場合、WSDLの生成やSOAP通信には、スーパークラスで宣言されたフィールドのみが使用されます。
Javaのクラスではプロパティの順番が保障されません。そのためiswsgen wsdlコマンドは、JavaからWSDLを生成する際に、プロパティを名前順に並べ替えることでWSDL上でメンバの順番の一貫性を保ちます。
そのほかのXMLの構造体
以下のXMLのデータ型は、Javaベースの開発では使用されませんが、WSDLおよびSOAP通信で利用は可能です。
xsd:allを内容とするxsd:complexTypeとして定義された型
メンバをxsd:attributeとして定義した構造体