【问题标题】:Designing Exception classes for a wrapper library为包装库设计异常类
【发布时间】:2013-02-01 11:21:20
【问题描述】:

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

我使用轴生成 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 中的任何类。因此,除了我的包装 jar 之外,我还需要创建更多的异常类。

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

现在,我正试图弄清楚如何最好地设计我的异常类——这样调用我的包装器的代码就不会丢失直接调用 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 并让其他所有内容都通过。

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

【问题讨论】:

    标签: java web-services exception axis


    【解决方案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;
      }
    }
    

    【讨论】:

    • 不确定 hide 是否是正确的词 - 我希望保护他们免受使用 jar 中的多个类的复杂性,而只使用 1 个类 - 我的包装器和相关的异常。我主要担心的是我不想丢失任何本来可用的异常信息。我仍然不清楚上述更改如何帮助我。
    • 由于您的包装器使用 WSException 类,因此使用您的包装器的任何代码都必须有权访问它(包括在类路径中)。当您说“我的包装器的客户永远不需要知道原始 Web 服务客户端 jar 中的任何类”时,我认为这就是您想要的。
    • 我可以在 m1exc 类中将 WSException 对象设为私有 - 这样客户就不需要知道它了。
    • 我在想您不希望您的客户必须包含其中包含 WSException 的任何 jar。就像您正在调用另一个 Web 服务并且您不希望您的客户依赖它。当我重新阅读您的问题和 cmets 时,我建议您只使用 m1() throw WSException 并摆脱 try/catch。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    相关资源
    最近更新 更多