2011-03-31 21 views
1

我的代碼拋出異常(由於錯誤)。在日誌中,我看到:RESTEasy隱藏真正的異常

org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException 
    at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:323) 
    at org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:199) 
    at org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:175) 
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:529) 
    etc... 

實際異常的堆棧沒有登錄。如果我將我的代碼包裝在try..catch中並記錄捕獲到的異常,我可以驗證我的代碼是否有問題。在我的系統中沒有其他庫會執行此操作,即使是深度包裝的異常也是如此,因此它在RESTEasy中可能會出現問題,可能是UnhandledException

有沒有辦法解決這個問題?我無法想到爲什麼它應該隱藏實際的例外。

  • 碼頭
  • 的Java
  • 春3.0.3
  • 的RESTEasy 2.0.1GA

回答

0

我不使用RestEasy的,但它似乎是RESTful Web服務調度機制。

假設情況如此,那麼它與其他庫有不同的設計目標:它們是從您的應用程序調用的,但RESTeasy負責調用您的應用程序。因此它必須保護自己免受代碼寫得不好。 「最後一個溝渠」異常處理程序是執行此操作的常用方法;你會在Swing中看到同樣的東西。

是否應該記錄未捕獲的異常是另一回事。也許有一個配置選項可以做到這一點。或者你可能需要添加幾行代碼。畢竟,它是開源的,我相信維護人員會喜歡一個精心編寫的帶補丁的bug報告。

1

你有一個ExceptionMapper嗎?請參閱RESTEasy文檔中的第27章異常處理。

我使用RESTEasy將REST添加到現有系統,而現有系統有異常包裝異常的奇怪方式,所以我的ExceptionMappers做了很多解包。

Throwable t = exception; 
while (t.getCause() != null) { 
    t = t.getCause(); 
} 
t.printStackTrace(); 
0

是的,您的異常被RESTeasy吞噬,包裝在UnhandledException中並記錄下來。但是你的例外太深了,不能包含在堆棧中。

要打印出你的異常到控制檯,你可以添加以下爲 'WEB-INF /班/ logging.properties'

org.apache.catalina.core.ContainerBase.[Catalina].level = FINEST 
org.apache.catalina.core.ContainerBase.[Catalina].handlers = java.util.logging.ConsoleHandler