[英]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.