Interstage Application Server SOAPサービス ユーザーズガイド
|
目次
索引

|
8.1.3 構造体型
構造体型は、任意の数のデータ(メンバと言います)を持つデータ型です。持つことのできるデータの数や型は、ユーザが自由に定義することができます。
XMLのデータ型 |
RPCアプリケーションのパラメタ(Javaのデータ型クラス) |
inまたはreturn |
outまたはinout |
構造体 |
構造体として定義した任意のクラス |
構造体として定義した任意のクラス |
メンバとしてString型のname、およびint型のageを持つXMLの構造体のWSDL定義は以下のようになります。
<complexType name="Human">
<sequence>
<element name="name" type="xsd:string "/>
<element name="age" type="xsd:int "/>
</sequence>
</complexType> |

- publicインスタンスフィールドで定義するメンバのほかに、Bean型と同様にset/getメソッドを提供することでもメンバを定義することもできます。この場合、set/getメソッドで定義するメンバと、publicインスタンスフィールドで定義するメンバで、メンバ名(プロパティ名)が重ならない様に定義してください。メンバ名(プロパティ名)の違いは、大文字小文字のみの違いではなく、スペルが異なる様に定義してください。
【in/return】
以下のように各メンバをpublicフィールドとして持つpublicクラスを定義し、それを構造体として使用します。
package パッケージ名
public classs 構造体名{
public メンバ型 メンバ名
public メンバ型 メンバ名
:
//public デフォルトコンストラクタ
public 構造体名();
} |
-

- 構造体の定義例
package fujitsu.sample; // パッケージ名
public class Human {
public String name; // 各メンバに関して宣言する
public int age;
public Human(){ // public デフォルト(引数なし)コンストラクタ
name="nobody"; age=0;
}
public Human(String myname, int myage){ // publicコンストラクタ(省略可)
name = myname; age = myage;
}
} |

- 構造体のメンバとして利用できるJavaのデータ型は、inパラメタ、または返り値として使用できるJavaのデータ型のすべてです。
- publicフィールドのみが、構造体のメンバとして使用されます。privateなどのフィールドは、構造体のメンバには使用できません。
- RPCクライアントアプリケーションで構造体を使用する場合は、javax.xml.rpc.encoding.TypeMappingRegistryクラスのregisterメソッドにより対応づけを登録する必要があります。
登録方法については、“Javaの値とXMLの値を変換するための変換マッピングの対応づけ”を参照してください。
構造体のメンバの値を参照・代入する場合、構造体として使用するクラスのインスタンスのフィールドを参照・代入してください。
-

- 構造体の使用例
Human person= new Human(); //宣言・new
:
person.name = "John"; // メンバ値のセット
person.age = 25;
:
String nameOfCustomer = person.name; // メンバ値の取得
int ageOfCustomer = person.age; |
【out/inout】
以下の表では、構造体として定義した任意のクラスを“構造体型”、構造体型の値を保持するHolderクラスを“構造体Holder”として記述しています。
クラス名 |
メソッド名 |
説明 |
構造体型Holder(構造体として定義した任意のクラスのHolder) |
public 構造体型 value |
インスタンスフィールド。
インスタンスが現在保持している構造体の値です。 |
public 構造体型Holder (構造体型 initial) |
コンストラクタ。
valueフィールドとしてinitialを持つインスタンスを作成します。 |
構造体をRPCサーバアプリケーションのメソッドのinout/outパラメタとして使用する場合、パラメタのデータ型として 構造体型Holder を使用します。RPCサーバアプリケーションのメソッドでは、パラメタとして受け取る構造体型Holderのインスタンスのvalueフィールドを更新します。これにより、更新された構造体データがRPCクライアントアプリケーションへ送信されます。
以下に構造体型Humanをvalueフィールドに持つHolderクラスの記述例を記述します。
-

- RPCサーバアプリケーションで使用するHolderクラス作成例(構造体型)
package fujitsu.sample; // パッケージ名
import javax.xml.rpc.holders.Holder;
public class HumanHolder implements Holder {
public Human value;
public HumanHolder() {} // デフォルトコンストラクタ
public HumanHolder(Human initial){
value = initial;
}
} |
-

- RPCサーバアプリケーションで構造体をinoutパラメタとして使用する例
//RPCサーバアプリケーションのメソッド
//構造体型はパラメタ情報としてWebサービス・マネージャに登録する。
public void server_method(HumanHolder person) {
person.value.age = person.value.age+1; //受け取った構造体のメンバを直接更新する場合
person.value = new Human(person.value.name, (person.value.age+1)); // 新たに構造体を作成する場合
} |
上記の例のサーバメソッドは、inoutパラメタであるpersonに、RPCクライアントアプリケーションから送信されたHuman型構造体データが保持されて呼び出されます。メソッドの処理のあと、personに保持されているHuman型構造体データがRPCクライアントアプリケーションに送信されます。この例では、2通りの方法で、サーバメソッドが受け取ったデータのメンバageに1を加算した(つまり2が加算されます)Human型構造体データをRPCクライアントアプリケーションに返却しています。
RPCサーバアプリケーションのout/inoutパラメタで構造体型の配列を使用する場合も、Holderクラスを作成します。以下はサーバアプリケーションのout/inoutパラメタで1次元配列の構造体型を使用する場合のHolderクラスの作成例を記述します。

- RPCサーバアプリケーションで使用するHolderクラス記述例(構造体配列型)
package fujitsu.sample; // パッケージ名
import javax.xml.rpc.holders.Holder;
public class ArrayOfHumanHolder implements Holder {
public Human[] value;
public ArrayOfHumanHolder() {} // デフォルトコンストラクタ
public ArrayOfHumanHolder(Human[] initial){
value = initial;
}
} |

- RPCサーバアプリケーションで構造体を使用する場合、Webサービス情報に、Java上で構造体を表すクラスと、XML上の型名との対応づけを記述する必要があります。これは、Javaのデータ型からXMLのデータ型への変換を行っているシリアライザ、およびXMLのデータ型からJavaのデータ型への変換を行うデシリアライザとして、それぞれにcom.fujitsu.interstage.soapx.encoding.ser.BeanSerializerFactoryとcom.fujitsu.interstage.soapx.encoding.ser.BeanDeserializerFactoryを登録することで実現します。
登録方法については、“Webサービス情報を記述するXMLタグ”に記述されている“typeMappingタグ”の説明を参照してください。
Copyright 2003 FUJITSU LIMITED