我有一组托管在服务器上的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}}&让其他一切都通过。
这听起来像是正确的策略吗?有没有更好的方法来做到这一点 - 主要标准是调用我的包装器的代码不应该丢失任何异常信息。为此目的是否有标准设计?
答案 0 :(得分:1)
您不会从客户端隐藏WSException类,我相信这是您要完成的任务。
而是让你的m1exc类接受code
和toString
作为从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;
}
}