2

我实际上正在使用 Axis 2 在 Java 中开发 Web 服务。我将服务设计为 POJO(普通旧 Java 对象),并带有公共方法抛出异常:

public class MyService {
   public Object myMethod() throws MyException {
        [...]
   }
}

然后我使用 Axis2 ant 任务生成了 WSDL。使用 WSDL,我生成了一个客户端存根来测试我的服务。生成的代码在存根声明中包含“MyExceptionException”和“myMethod”以抛出:

public class MyServiceStub extends org.apache.axis2.client.Stub {
    [...]
    public MyServiceStub.MyMethodResponse myMethod(MyServiceStub.MyMethod myMethod)
    throws java.rmi.RemoteException, MyExceptionException0 {
        [...]
    }
    [...]
}

但是,当调用被 catch 包围的方法时,“MyExceptionException”永远不会被传输 AxisFault 的服务器传输(RemoteException 的子类)。

我认为问题出在服务器端,但找不到在哪里。该服务作为 aar 文件部署在 Tomcat 5.5 服务器上的axis2 webapp 中。services.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<service name="MyService" scope="application">
    <description></description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" 
            class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
           class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass">MyService</parameter>
    <parameter name="ServiceTCCL">composite</parameter>
</service>

如果行为正常,那么我将放弃使用异常(这对我的项目并不重要),但我很谨慎为什么 Java2WSDL 在操作输入和输出声明中生成自定义 <wsdl:fault> 并且 WSDL2Java 生成一个异常类(并声明将其放入存根方法中)如果这不可用...

4

3 回答 3

4

我真的不认为有问题。您的客户端调用服务器上的方法。该方法导致异常。Axis 将此异常转换为可以发送给客户端以指示错误的内容。

据我所知,所有异常都被包装到一个 AxisFault 中,然后我相信它会作为带有异常消息描述的 SoapFault 消息传输给客户端。

换句话说,客户端应该只看到AxisFaults,因为异常(异常类)没有被序列化和发送。服务器异常应成为客户端的 AxisFaults。

于 2008-10-10T17:26:46.157 回答
1

您是否尝试过将 Axis2 与 Lady4j 一起使用,它为我们解决了这个问题。

于 2009-11-19T09:46:25.717 回答
1

如果您的 WSDL 指定您的服务抛出一个自定义错误,您的客户端应该期望处理这些错误以及由 Axis2 的操作抛出的一般远程异常。

当您的存根从服务器接收到 AxisFault 时,如果在您的 WSDL 中指定,它会尝试构建自定义异常。如果失败,它将简单地传递 AxisFault。

存根将尝试调用 f.getDetail()。如果为 null,则不会尝试构造自定义异常,并将传递 AxisFault。在 Axis2 1.5 中,服务器端自动生成的 MessageInOutReciver 默认不设置此值。

您可以像这样在服务器端手动设置它(假设您有自动生成的 MyFaultException 和 MyFault 类):

        MyFaultException ex = new MyFaultException("My Exception Message");
        MyFault fault = new MyFault();
        fault.setMyFault("My Fault Message");
        ex.setFaultMessage(fault);
        throw ex; 
于 2010-05-27T09:35:13.213 回答