0

wsdl2java を使用してサービスを生成しています。生成の引数は次のとおりです。

-p com.dummy.tst.service -u -f -sp -s -b -ssi -d xmlbeans -uri /some/path/service.wsdl -ss -g -sd -o /some/path/gen

生成後、次のような行を含む services.xml ファイルを取得しました

<parameter name="ServiceClass">com.dummy.tst.service.TestSoapBindingImpl</parameter>

次に、genディレクトリにメソッドのリストを含むTestSoapBindingImpl.javaがありますが、すべてのメソッドは次のように定義されています

throw new  java.lang.UnsupportedOperationException("Please implement " + this.getClass().getName() + "#myMethod");

また、実際に実装されたメソッドを含む TestSoapBindingStub.java ファイルもあります。axis-1 には、メソッドの説明と実装を含むファイルが 1 つだけあり、axis-2 には 2 つのファイルがあります。

これらのファイルはどうすればよいですか? デフォルトのサービスメソッドコンテナーとして指定されている(services.xml内の)Implファイルにはダミーしか含まれていないため、デプロイされたサービスを使用できず、services.xml内のTestSoapBindingImplをTestSoapBindingStubに置き換えても、望ましい結果にはなりません。

4

1 に答える 1

2

TestSoapBindingStub.javaクライアントのためです。これには、リモート システムで Web サービスを呼び出すコードが含まれています。

サービス側では、リクエストが来るたびに、Axis2 はservices.xmlServiceClass として指定されたタイプのオブジェクトを作成します。次に、クライアントから提供されたオブジェクトを使用して、ServiceClass オブジェクト内で要求された関数を呼び出します。

wsdl2java によって生成されたコードを使用すると、サービスへのすべての呼び出しで type のオブジェクトが作成om.dummy.tst.service.TestSoapBindingImplされます。これは、前述のように、呼び出しごとに例外をスローします。実用的なサービスを作成するには、2 つの方法があります。

  1. TestSoapBindingImpl.java手元にあるファイルを出発点として使用できます。各関数から行を削除しthrows、リクエストが来たときに実際に実行するコードを各関数本体に入力します。

  2. services.xmlまたは、開始点として使用することもできます。独自のクラスをサービス クラスとして定義します。com.dummy.tst.service.TestSoapBindingImplへの参照を、独自のサービス クラスの名前への参照に置き換えます。TestSoapBindingSkeleton.javawsdl2java はおそらく、サービス クラスが実装するインターフェイスを定義するような名前のファイルを生成しました。カスタム サービス クラスは、このインターフェイスを実装する必要があります。

私が取り組んできたプロジェクトでは、アプローチ #2 を使用しています。スケルトン インターフェイスを実装する独自のサービス クラスを作成します。サービスを AAR ファイルにパッケージ化するときは、そのservices.xmlファイルを AAR に含めます。パッケージング ルールは、生成された に対してテキスト置換を実行しservices.xml、ServiceClass をサービス クラスの名前で更新します。

于 2012-09-25T01:30:51.800 に答える