2010-11-01 50 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