2008-10-10 107 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;