2010-11-01 49 views
2

我追逐什麼應該是一個簡單的NullPointerException但Web服務代理不斷吞嚥錯誤。如何讓Java WebService真正向代理對象顯示異常?

WS通過簡單的客戶端庫公開,該客戶端然後調用WS。在WS的某個地方有一個NPE,我無法找到它,因爲堆棧跟蹤只顯示「$ Proxy.someMethod」而不是問題的原因。

如何從代理對象獲取堆棧跟蹤?記錄或處理這些異常是否有很好的策略?

... 
Caused by: javax.xml.ws.soap.SOAPFaultException: java.lang.NullPointerException 
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:187) 
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:116) 
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:254) 
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:224) 
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:117) 
******** I need the trace from this line ********* 
    at $Proxy43.myMethod(Unknown Source) 
***************** 
    at com.mypackage.client.MyClient.aMethod(MyClient.java:70) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:161) 
    ... 17 more 

我已經做了一些閱讀,似乎這與檢查與未檢查的異常有關。所以如果我拋出一個IOException異常,我會得到堆棧跟蹤,但是因爲有一個NullPointerException冒泡,所以它沒有給我跟蹤。

回答

1

將您的服務包裝在try/catch塊中,並在WSDL中拋出被定義爲被調用服務的fault元素的異常。這樣客戶端將獲得可用的堆棧跟蹤。

+0

我們處於開發/測試階段,因此它有助於在客戶端獲得完整的堆棧跟蹤。我們的測試人員可以向我們發送客戶端錯誤,而不是給我們發送無用的痕跡,大量掙扎給我一個時間戳,然後讓我的團隊去釣魚通過日誌。 – Freiheit 2010-11-02 13:25:44

+0

@Freiheit - 我已經重新做了我的答案,並檢查它的工作原理。希望有幫助。 – Catchwa 2010-11-03 01:30:51

+0

聽起來像它會起作用。公認。這也讓我更接近於返回有用的錯誤代碼/消息,而不僅僅是噴出堆棧跟蹤。 – Freiheit 2010-11-03 14:13:42