2008-10-10 117 views
2

我实际开发使用轴2 在Java Web服务我设计的公共方法抛出异常服务为POJO(普通Java对象):Web服务引发异常

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 { 
     [...] 
    } 
    [...] 
} 

但主叫通过钳位包围的方法时,“MyExceptionException”从不通过发送服务器发送而不是AxisFault(RemoteException的子类)。

我认为问题是服务器端,但没有找到在哪里。该服务被部署为tomcat 5.5服务器上的axis2 webapp中的aar文件。中声明。看起来是这样的:

<?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:错误>在操作输入&输出声明和WSDL2Java生成一个Exception类(并声明将它扔在存根方法),如果这是不可用的...

回答

4

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

据我所知,所有异常都被封装到一个AxisFault中,然后传输到客户端,我相信这是一个SoapFault消息,其中描述了异常消息。

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

+0

在服务器端生成的代码,它产生AxisFault并添加到SOAP上下文org.apache.axis2.Constants.FAULT_NAME来映射WSDL中的自定义错误... – Vinze 2009-01-13 14:04:33

+0

在客户端存根中,问题似乎是org.apache.axiom.om.OMElement faultElt = f.getDetail();返回null ...所以存根无法将轴故障映射到自定义java异常(它是从WSDL生成的)... – Vinze 2009-01-13 14:05:47

+1

对我来说看起来像一个bug。如果一个方法明确声明了它的异常,那么这些异常应该被序列化并相应地传输。即使eclipse轴web服务客户端生成器也会在客户端生成异常类。 IMO – 2014-01-15 18:09:42

1

您是否试过在Lady4j上使用Axis2,它为我们解决了这个问题。

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;