2009-08-12 49 views
5

首先,我拋出運行時異常的所有不可恢復的異常每個異常,這將導致這些異常向上行進到容器中,在那裏我目前使用錯誤頁面(在web.xml中定義)。在這個錯誤頁面中是一個調用記錄器的scriptlet。在捕獲的Java EE Web應用程序

我與這個有問題的是,異常不再是堆在這個調用上。我可以從請求範圍變量(「javax.servlet.error.message」)訪問它。這個字符串是堆棧跟蹤。我明顯需要這個堆棧跟蹤記錄的目的,並在不同的應用程序服務器「javax.error_message」可以關閉,出於安全原因.......

所以我的問題是,如何最好地記錄運行時異常在Java EE應用程序中不包含所有內容:

try {} catch (Exception e) {logger.log(...)} 

我想一些方法來調用從說不定容器記錄器...容器捕獲例如例外權利之前。

+0

你在使用什麼框架? Struts的?彈簧? – 2009-08-12 15:45:21

+0

這將是框架獨立。我們不希望它綁定到任何特別的東西(應用程序服務器或框架)。我們實際上支持3個框架。這些是普通的j2ee/struts/JSF(特別是Oracle對JSF的適應:ADF Faces)。至於後端,PL/SQL存儲過程或SQL/jdbc ...就像ADF Faces一樣,它使用的ADF業務組件與Toplink類似。 – Zombies 2009-08-12 15:49:47

回答

3

我找到了解決辦法。通過添加響應濾波器和包裝chain.doFilter(REQ,RESP)像這樣:

try { 
    chain.doFilter(req,resp); 
} catch (Exception e) { 
    logger.error("", e); 
    throw new RuntimeException(e); 
} 

到目前爲止是這種情況很好,不依賴於特定的框架或應用服務器。

1

在Servlet API中沒有任何東西可以實現這一點。

然而,你可以在Tomcat中有一個實例監聽做到這一點。你可以在這樣的context.xml安裝監聽器,

<InstanceListener>myapp.MyListener</InstanceListener> 

Tomcat的火災InstanceEvent.AFTER_SERVICE_EVENT事件容器捕獲異常後馬上再次拋出異常之前。你可以在那裏調用記錄器。

+0

您是否知道這是否可以在Oracle Weblogic或Oracle Application Server中完成? – Zombies 2009-08-12 17:04:31

+0

沒有與其他容器的經驗。很可能他們都有類似的東西(可能沒有文檔),因爲容器需要鉤住它自己的生命週期管理。 – 2009-08-12 20:09:33

+0

似乎Oracle確實通過JSF來實現這一目標,我們將在ADF Faces(Oracle的JSF實現)上執行此操作:http://database.in2p3.fr/doc/oracle/Oracle_Application_Server_10_Release_3/web.1013 /b28967/web_val008.htm – Zombies 2009-08-13 13:34:12

0

糾正我,如果我錯了,但「例外」對象存在作爲你的「錯誤」的jsp稱爲「例外」變量...。您始終可以使用此對象來記錄檢索異常信息並登錄到錯誤的jsp本身。