2012-05-08 289 views
4

我嘗試了omniFaces的AjaxExceptionHandler(這很有幫助),並將其配置爲捕獲java.lang.Throwable以及源於各種請求(不僅僅是ajax請求)的異常。如何使用自定義異常處理程序處理javax.el.PropertyNotFoundException

它工作的很好,但是當開發人員拼寫錯誤的EL表達式時,它並沒有趕上javax.el.PropertyNotFoundException

所以問題是:如何處理javax.el.PropertyNotFoundExceptionExceptionHandlerFactory機制的JSF2?

回答

2

FullAjaxExceptionHandler應該能夠處理它。您的具體問題可能是由於您的頁面相對較大,導致Facelets的默認緩衝區大小爲2KB,因此響應在引發異常時已經落實。當提交響應時,部分響應已經發送到客戶端。有沒有辦法採取已經發送的字節回來並提出一個新的錯誤頁面的響應。不使用ajax時你會遇到完全相同的問題。這個異常將會被記錄下來,客戶端將會停留在半頁的頁面上。

您可能希望將默認響應緩衝區大小增加到大約最大的HTML響應的大小。這樣,響應將在第一個字節發送到客戶端之前在服務器的內存中生成並緩衝。您可以通過javax.faces.FACELETS_BUFFER_SIZE上下文參數web.xml來設置它,緩衝區大小以字節爲單位。以下示例將其設置爲64KB。

<context-param> 
    <param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name> 
    <param-value>65535</param-value>  
</context-param> 

您可能要將此開發/測試環境只有這樣在觀看側的任何錯誤可以被發現和實時環境可以繼續使用默認的緩衝區大小,以節省服務器內存。

+0

奇怪的是我看到異常處理程序運行之前在服務器日誌中的異常。對於其他例外,這不會發生。所以我看到'PropertyNotFoundException'兩次,一次在異常處理程序之前,然後異常處理程序用此行記錄它'context.getExternalContext()。log(String.format(LOG_EXCEPTION_OCCURRED,errorPageLocation),exception);' t看到一個半成品頁面,我只是在沒有菜單的情況下獲得應用程序的背景(但加載了所有的JSF資源(* .css,* .js))。提及MyFaces和IBM WAS8會發生這種情況有幫助嗎? – jonnie119

+0

**是**半頁的頁面。在瀏覽器中右鍵單擊和*查看源代碼*。檢索到的HTML響應不完整,因爲由於此異常而被中止。 – BalusC

+0

我在JBoss上部署了一個測試應用程序,並在Mojarra和MyFaces之間切換;都工作正常,你的異常處理程序完美地處理它! 但是增加緩衝區大小對Websphere AS沒有幫助。所以這個問題是在我們的應用程序或在WAS8的一般設置,我還不知道這是一個設置。我會發布進一步的調查結果 – jonnie119