0

サーバーでホストされている一連の Web サービスがあります。

java org.apache.axis.wsdl.WSDL2Java http://whatever1?wsdl, java org.apache.axis.wsdl.WSDL2Java http://whatever2?wsdl軸を使用して、Web サービス (など)のクラスとスタブを生成します。

これにより、jar ファイルを作成するための多くのクラスが生成されます。

特定のプロジェクトでは、jar のさまざまなクラスを使用して 3 つのタスクを実行するラッパー クラスを作成する必要があります。これは、jar 内のすべての異なるクラスを抽象化し、3 つの異なるタスクを達成するために 3 つの異なるメソッドを呼び出す 1 つのクラスを提示することです)。

ラッパー クラスのコーディングは完了しましたが、Web サービス クライアントの jar ファイルからスローされた例外を処理する方法について非常に混乱しています。

要件の 1 つは、ラッパーのクライアントが元の Web サービス クライアント jar のクラスについて知る必要がないことです。したがって、ラッパー jar 以外に、さらにいくつかの例外クラスを作成する必要があります。

Web サービス クライアント jar には、3 ~ 4 種類のユーザー定義の例外クラスがあり、それらはすべて派生元でWSExceptionあり、次に派生元になりますorg.apache.axis.AxisFault(これは、クライアント jar を生成するために軸を使用したためです)。

現在、例外クラスを最適に設計できる方法を見つけようとしています。これにより、ラッパーを呼び出すコードが、Web サービス クライアントを直接呼び出す場合に取得できた情報を失うことはありません。

ラッパーには 3 つの異なるタスクを実行する 3 つのメソッド (m1、m2、m3 など) があるため、3 つの例外クラス (m1exc、m2exc、m3exc) があると考えていました。

これは例外クラスのサンプルです

public class m1exc
{
    WSException ws;

    public m1exc(WSException e)
    {
        ws = e;
    }

    public String toString()
    {
        return ws.toString();
    }
    // Returns the error code
    public int getCode()
    {
        return ws.getCode();
    }

}

私のラッパーでは、

class Wrap
{
    void m1() throws m1exc, javax.xml.rpc.ServiceException, java.rmi.RemoteException
    {
        try
        {
            // call stuff from the webservice client jar to get things done
        }
        catch(WSException w)
        {
            throw new m1exc(w);
        }
    }
}

ラッパー コードでは、catch ブロックを試して、WSException他のすべてを通過させます。

これは正しい戦略のように聞こえますか? これを行うためのより良い方法はありますか - 主な基準は、ラッパーを呼び出すコードが例外情報を失うべきではないということです。この目的のための標準設計はありますか?

4

1 に答える 1

1

クライアントから WSException クラスを隠すことはありません。これは、あなたが達成しようとしていると私が信じていることです。

代わりに、m1exc クラスが、WSException から渡す引数としてcodeおよびを受け入れるようにします。toStringWSException クラスから任意のフィールドを追加できます。

m1exc がプログラマーが必要とする値だけでなく、WSExceptions によって作成されることを強制するには、WSException を受け入れて m1exc を生成する m1exc ファクトリを作成できます。ファクトリと m1exc は、m1exc コンストラクターがパッケージ内でのみアクセスできるようにする m1exc クラスのコンストラクターでアクセス修飾子 (パブリック) を使用せずに同じパッケージにある必要があります。

public class m1excFactory {

  public static m1exc createM1Exc(WSExcetion e){
    return new m1exc(e.toString(), e.getCode());
  }
}

public class m1exc{
  String message;
  int code;

  m1exc(String message, int code)
  {
     this.message = message;
     this.code = code;
  }

  public String toString()
  {
    return message;
  }
  // Returns the error code
  public int getCode()
  {
      return code;
  }
}
于 2013-02-01T14:00:37.263 に答える