为包装器库设计异常类

时间:2013-02-01 11:21:21

标签: java web-services exception axis

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

我使用axis来生成webservices的类和存根(java org.apache.axis.wsdl.WSDL2Java http://whatever1?wsdl, java org.apache.axis.wsdl.WSDL2Java http://whatever2?wsdl等)

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

对于特定项目,我必须创建一个包装类,它使用jar中的不同类来执行3个任务。这是为了抽象出jar和amp;中所有不同的类。提出1个课程,你可以用3个不同的方法来实现3个不同的任务。)

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

其中一个要求是我的包装器的客户端永远不需要知道原始webservice客户端jar中的任何类。所以除了我的包装器jar之外,我还需要创建一些异常类。

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

现在,我正在试图弄清楚如何最好地设计我的异常类 - 这样调用我的包装器的代码不会丢失任何在它直接调用webservice客户端时可能获得的信息。 / p>

由于我的包装器中有3个方法(比如m1,m2,m3)执行三个不同的任务,我以为我会有3个异常类(m1exc,m2exc,m3exc)。

这是一个示例异常类

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

在包装器代码中,我会尝试使用catch块来捕获{{1}}&让其他一切都通过。

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

1 个答案:

答案 0 :(得分:1)

您不会从客户端隐藏WSException类,我相信这是您要完成的任务。

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

要强制执行m1exc是由WSExceptions创建的,而不仅仅是程序员想要的任何值,您可以创建一个接受WSException并生成m1exc的m1exc工厂。工厂和m1exc应该在同一个包中,m1exc类的构造函数中没有访问修饰符(public),这使得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;
  }
}