3

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 スキーマは一般的に、この特定のケースに使用するのに最適なツールではありませんか?

4

1 に答える 1

4

直面している問題を説明するには、サービスが呼び出されたときに Axis が何をする必要があるかを考えると役に立ちます。

Axis は単なる Java Web アプリケーションです...サービスのリクエストを受け取ると、定義したマッピングを検索します。マッピングが見つかった場合は、リクエストを処理するために定義した必要なクラスのインスタンスを作成しようとします。

クラスを抽象またはインターフェイスとして定義した場合、これらの型を作成できないため、InstantiationExceptions が発生します。Axis が wsdl を作成しようとしたとき、配置するタイプを判断できないため、「anyType」を使用します。

あなたの質問に答えるには、上記のモデルをコードで使用できますが、これらのクラスを Axis で使用することはできません。私たちがプロジェクトで通常行ったことは次のとおりです。

  1. 典型的なオブジェクト指向アプリケーションで行うように、必要なクラスを定義します
  2. Web サービスに使用される「トランスポートのみ」のクラスを定義します。これらのクラスは単純な型で構成されており、簡単に作成できます。これらは、Web サービス メッセージの交換にのみ使用されます。これらのクラスを Axis で使用します。
  3. これら 2 種類のクラスが簡単に情報を共有/交換できる方法を見つけてください。両方で共有されるインターフェイスを持つことも (Axis は知らない)、BeanUtils.copyProperites を使用して 2 つの異なるオブジェクトを同期させることもできます。

それがあなたの質問に答えることを願っています。

于 2009-02-16T20:21:38.780 に答える