0

我有一组托管在服务器上的网络服务。

我使用轴为 web 服务(java org.apache.axis.wsdl.WSDL2Java http://whatever1?wsdl, java org.apache.axis.wsdl.WSDL2Java http://whatever2?wsdl等)生成类和存根

这会生成很多类,我从中创建一个 jar 文件。

对于一个特定的项目,我必须创建一个包装类,它使用 jar 中的不同类来执行 3 个任务。这是为了抽象出 jar 中的所有不同类并提供 1 个类,您可以在该类上调用 3 个不同的方法来实现 3 个不同的任务)。

我已经完成了包装类的编码,但是对于如何处理从 web 服务客户端 jar 文件中抛出的异常,我感到非常困惑。

要求之一是我的包装器的客户端永远不需要知道原始 web 服务客户端 jar 中的任何类。所以除了我的包装罐之外,我还需要创建更多的异常类。

在 webservice 客户端 jar 中有 3-4 种不同类型的用户定义的异常类,所有这些类都派生自WSException这些类,而这些类又派生自org.apache.axis.AxisFault(这是因为我使用了轴来生成客户端 jar)。

现在,我试图弄清楚如何最好地设计我的异常类——这样调用我的包装器的代码就不会丢失直接调用 web 服务客户端时可能获得的任何信息。

由于我的包装器中有 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);
        }
    }
}

在包装器代码中,我会尝试捕获我将捕获的块并WSException让其他所有内容通过。

这听起来像是正确的策略吗?有没有更好的方法来做到这一点 - 主要标准是调用我的包装器的代码不应该丢失任何异常信息。是否有为此目的的标准设计?

4

1 回答 1

1

您不会向您的客户隐藏 WSException 类,我相信这是您想要完成的。

而是让您的 m1exc 类接受codetoString作为您从 WSException 传递的参数。您可以从 WSException 类中添加您喜欢的任何其他字段。

要强制 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 回答