Axis を使用してサンプル WebService をモデル化しています。私が今していることは、自動化された wsdl とコード生成の制限を理解しようとしていることです。
次に、サーバー側のコードをいくつか示します。
これは、サンプル Web サービスのスケルトンです。
public class TestWebService {
public AbstractAttribute[] testCall( AbstractAttribute someAttribute ) {
....
そして私のデータクラス: public abstract class AbstractAttribute { String name;
/*get/set for name*/
public abstract T getValue();
public abstract void setValue(T value);
}
public class IntAttribute extends AbstractAttribute<Integer> {
Integer value;
public Integer getValue(){ return value; }
public void setValue(Integer value){ this.value = value; }
}
public class StringAttribute extends AbstractAttribute<String> {
String value;
/* ok, you got the point, get/set for value field */
}
Axis2 の Eclipse ツールは、次のような属性クラスのスキーマを含むこれらのソースから wsdl を生成します。
<xs:complexType name="AbstractAttribute">
<xs:sequence>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="IntAttribute">
<xs:complexContent>
<xs:extension base="xsd:AbstractAttribute">
<xs:sequence>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:int"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="StringAttribute">
<xs:complexContent>
<xs:extension base="xsd:AbstractAttribute">
<xs:sequence>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
ここで何か変だと思うと、AbstractAttribute には ** abstract="true" ** 属性がなく、anyType 値要素を定義し、IntAttribute と StirngAttribute で書き換えられます。これが合法的なスキーマであるかどうかもわかりません (ちなみに、合法的ではないと思います)。
さらに、この wsdl から (常に Eclipse ツールを使用して) クライアントを生成しようとすると、生成されたソースはコンパイルされません。
Object localValue;
フィールドおよび Int/String 属性の定義
int localValue;
と
String localValue;
..私はソースを「収容」しようとしました (明らかに、多くの希望はありません)。その結果、サーバーは AbstractAttribute インスタンスをインスタンス化しようとします (InstantiationException をスローします)。
だから私の質問は、上記のデータモデルのようなものをモデル化する方法がありますか、それとも Web サービスと XML スキーマは一般的に、この特定のケースに使用するのに最適なツールではありませんか?