1

WSDL バージョン間で異なる生成済み SOAP クライアント スタブが多数あります。これは、SOAP サーバーの Web サービスのバージョンが異なるために発生します。

Web サービス バージョン 1 のスタブは soap.stubs.version1 にパックされ、バージョン 2 のスタブは soap.stubs.version2 の下にパックされます。

これは、WSDL のバージョン 1 の MyStub がバージョン 2 の MyStub と異なる可能性があることを意味します。したがって、MyStub のバージョン 2 を返し、MyStub のバージョン 1 の値を保持する SOAP メソッドを呼び出すと、「壊れる」ことになります。 xml 応答をスタブの属性に正しくマップできません。

このため、クラス タイプを SOAP サーバーに関連付ける必要があります。

バージョンごとにロジックを複製することは、単純に不可能です。

if(SoapServer.version==1)
{
   soap.subts.version1.MyStub result = SoapServer.getFoo();
   /* rest of the logic using result of type soap.subts.version1.MyStub */ 
}
else if(SoapServer.version==2)
{
   soap.subts.version2.MyStub result = SoapServer.getFoo();
   /* rest of the logic using result of type soap.subts.version2.MyStub */
}

新しいバージョンのスタブを生成するたびに、新しいスタブを使用するためにすべてのロジックを複製する必要があります。変更されるのは属性だけの場合もあります。

そのため、その「クラス」のすべてのロジックを再実装することなく、SOAP サーバーに応じて適切なスタブを使用するにはどうすればよいでしょうか?

Object を使用することも考えましたが、if instanceof とキャストの割り当てが必要になります。

4

1 に答える 1

0

Java リフレクションと URLClassLoader のミスでこの問題を解決することができました。私が基本的にやったことは:

  • サーバーのバージョンに応じて、字幕を取得する場所からパッケージ名を定義します
  • URLClassLoader を使用して、正しい .class ファイルをロードします
  • リフレクションを使用して正しいメソッドを呼び出す

これには、スタブ バージョンが異なっていても、プラグ アンド プレイ SOAP サーバーの大きな利点があります。バージョン間で一定でなければならないのはメソッド名だけなので、Class.getMethod を介して取得できます。

于 2012-06-26T16:31:15.393 に答える