2011-11-10 31 views
1

ViewExpiredException正在通過重定向到登錄屏幕進行處理。問題在於異常仍然記錄在案,客戶強烈希望擁有免除異常的server.log如何吞嚥JSF 1.2/Mojarra中的異常

雖然在這種情況下可能是一個值得懷疑的要求,但我仍然必須做到這一點。我們用鑽嘴魚科和部署在JBoss EAP 5.1

MyFaces approach沒有幫助,因爲我顯然不能用鑽嘴魚科

包裹 MyFacesServlet

我不能適用於JBoss JSF guide給出的建議來包裝面的servlet,因爲我無法找到任何地方都可以使用jsf-integration-deployer-jboss-beans.xml。我不能得到approach proposed by Ed Burns工作要麼。我想原因是它是針對JSF2的,因爲我在我的罐子裏找不到javax.faces.context.ExceptionHandlerFactory。讓事情變得更糟,我對JSF相當陌生,所以我不得不依靠詳細的指導,找到了我找到的上述方法但未能應用它們。

謝謝

+1

任何你無法在log4j配置中使用過濾器或阻止某個記錄器來處理它的原因? – mrembisz

+0

@mrembisz並非如此。爭取JSF-y解決方案,我還沒有想到。我會去的。謝謝 – kostja

回答

2

該文章確實針對JSF 2.x. JSF 1.x沒有任何異常處理工具。

只需抓住並重定向自己而不是讓容器做。過濾器是一個明智的地方是:

try { 
    chain.doFilter(request, response); 
} catch (ServletException e) { 
    if (e.getRootCause() instanceof ViewExpiredException) { 
     HttpServletRequest req = (HttpServletRequest) request; 
     HttpServletResponse res = (HttpServletResponse) response; 
     res.sendRedirect(req.getContextPath() + "/errors/session-expired.jsf"); 
    } else { 
     throw e; 
    } 
} 

地圖這web.xmlFacesServlet的servlet名稱,以使之運行。

+0

謝謝,聽起來很合理。我發現了一個關於servlet過濾器的教程並且現在閱讀它。將盡快提供反饋 – kostja

+0

雖然這很簡單。上面的代碼需要在'doFilter()'方法中完全使用。 'init()'和'destroy()'可以保持爲空。您可以在我們的servlet過濾器wiki中找到一個模板:http://stackoverflow.com/tags/servlet-filters/info過濾器映射的唯一區別是您應該使用' TheServletNameOfYourFacesServlet '而不是''。 – BalusC

+0

這是一個密切的匹配,它設法擺脫了日誌中的堆棧跟蹤。但是我仍然得到'SEVERE [javax.enterprise.resource.webcontainer.jsf.lifecycle] ...在階段執行期間引發的異常:javax.faces.event.PhaseEvent'。這是在拋出異常之前立即記錄的。 – kostja