簡體   English   中英

@PostConstruct中拋出的異常會導致JSF 2.1中出現IllegalStateException

[英]Exception thrown in @PostConstruct causes IllegalStateException in JSF 2.1

我的@ViewScoped mananged bean上有一個init方法。 在post構造中,我從db加載數據。 我有一個自定義ExceptionHandlerWrapper來捕獲所有的排除並發送到錯誤頁面。 但是當@PostConstuct拋出異常時,我收到IllegalStateException並且沒有重定向到錯誤頁面。 我嘗試了很多組合......

我在我的ExcpetionHandler中嘗試過這個

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

這一行是我原來的。 它也很有用

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

這些都會導致IllegalStateExceptions。 我也稱為重定向具有相同的結果。

你可以全局捕獲從@PostConstruct拋出的錯誤嗎?

這些都會導致IllegalStateExceptions。

有了消息“響應已經提交”,我假設? 嗯,這是一個不歸路的點。 響應的一部分已經發送到客戶端(webbrowser)。 無法取回已發送的字節。 服務器最終會在日志中出現此異常,客戶端將以半熟響應結束。

你能做什么?

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

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

默認值為~2KB,具體取決於服務器配置。 您只需要記住,當您的服務器必須處理相對大量的請求/響應時,這可能會占用內存。 正確地描述和測量。

另一種方法是在呈現/提交響應之前引用bean 以便在該點之前觸發它(post)構造。 也許有問題的bean第一次被引用到視圖的最底部,遠遠超過~2KB的響應大小邊界。 您可以在視圖頂部的某處使用<f:event type="preRenderView">接管@PostConstruct的工作。 例如

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM