Web服务使用Axis2 Java抛出异常

时间:2008-10-10 15:18:21

标签: java web-services exception axis

我实际上是使用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的子类)。

我认为问题是服务器端但是找不到位置。该服务在tomcat 5.5服务器上的axis2 webapp中部署为aar文件。 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>

如果行为正常,那么我将放弃使用Exceptions(这对我的项目来说并不重要),但我很谨慎为什么Java2WSDL生成自定义&lt; wsdl:fault&gt;在操作输入&amp;输出声明和WSDL2Java生成一个Exception类(如果不可用,则声明将其抛入stub方法中)...

3 个答案:

答案 0 :(得分:4)

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

据我所知,所有异常都包含在AxisFault中,然后传输给客户端,我相信,这是一个SoapFault消息,其中包含异常消息的描述。

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

答案 1 :(得分:1)

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

答案 2 :(得分: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;