2012-03-23 56 views
1

我在@ViewScoped mananged bean上有一個init方法。在後構造我加載數據從數據庫。我有一個自定義ExceptionHandlerWrapper來捕獲所有附加信息併發送到錯誤頁面。然而,當@PostConstuct拋出一個異常,我收到一個IllegalStateException,並沒有重定向到錯誤頁面。我已經嘗試了多種組合.....在@PostConstruct中引發的異常在JSF 2.1中導致IllegalStateException

我用盡我這ExcpetionHandler

externalContext.getRequestMap().put(ERROR_BEAN_ID, ERROR_TEXT); 
externalContext.dispatch(ERROR_PAGE); 
fc.responseComplete(); 

內部下面這行是什麼原本我。它還doent工作

externalContext.getFlash().put(ERROR_BEAN_ID, ERROR_TEXT); 
nav.handleNavigation(fc, null, ERROR_PAGE); 
fc.renderResponse(); 

這些都導致IllegalStateExceptions。我也叫同樣的結果重定向。

您可以全局捕獲@PostConstruct引發的錯誤嗎?

回答

3

這些都會導致IllegalStateException異常。

消息 「迴應已經承諾」,我認爲?那麼,這是一個不歸路。部分響應已經發送給客戶端(網頁瀏覽器)。無法將已發送的字節送回。服務器最終會在日誌中發生這種異常,客戶端將以半響應結束。

你能做什麼?

最直接的方法是將響應緩衝區大小放大到最大頁面的大小。例如,64KB:

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

根據服務器配置,它默認爲〜2KB。你只需要記住,當你的服務器需要處理相當多的請求/響應時,這可能會導致內存耗盡。配置文件並正確測量。

另一種方式是之前引用豆的響應被渲染/犯下如此,它的(崗位)建設點之前觸發。也許有問題的bean是第一次在視圖底部引用,遠遠超出〜2KB響應大小的邊界。您可以接管@PostConstruct的工作,並在視圖頂部的某個地方使用<f:event type="preRenderView">。例如。

<f:event type="preRenderView" listener="#{bean.init}" /> 

public void init() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     // Do here your original @PostConstruct job. 
    } 
} 
+0

謝謝。是的「響應已經提交」是錯誤取決於我是否使用重定向/調度。我剛剛刪除了preRenderView的使用,因爲我動態配置了來自db和f:validateBean等的元數據的頁面,並且f:標記在調用preRenderView之前被初始化。從而導致頁面驗證無法正常工作。所以如果我需要預先加載的數據,將配置視圖和全局異常處理我堅持與緩衝區解決方案? – user1147953 2012-03-24 02:15:45

相關問題