2012-03-23 11 views
1

@ViewScoped Mananged Beanにinitメソッドがあります。 post構造体では、dbからデータをロードします。私はカスタムExceptionHandlerWrapperを使用してすべての消耗品をキャッチし、エラーページに送信します。しかし、@PostConstuctが例外をスローすると、IllegalStateExceptionが返され、エラーページにリダイレクトされません。私は、以下のこの行は、私が元々持っていたものである @PostConstructでスローされた例外により、JSF 2.1で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からスローされたエラーをグローバルに捕捉できますか?

答えて

3

これらはすべてIllegalStateExceptionsの原因となります。

"Response already committed"というメッセージが表示されますか?まあ、それは返品のない点です。応答の一部はすでにクライアント(Webブラウザ)に送信されています。既に送信されたバイトを元に戻すことはできません。サーバーはこの例外をログに記録し、クライアントは半分の応答で終了します。

あなたは何ができますか?

最も簡単な方法は、応答バッファのサイズを最大ページのサイズに拡大することです。たとえば、64KB:

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

デフォルトでは、サーバーの構成によって2KBまでです。サーバが比較的多くのリクエスト/レスポンスを処理しなければならないときに、これがメモリ不足になる可能性があることに留意する必要があります。適切に測定し、測定する。

もう1つの方法は、の前にの応答をレンダリング/コミットして、そのポイントより前に(ポスト)構成がトリガーされるようにすることです。おそらく、問題のBeanは、ビューの最下部で〜2KBの応答サイズの枠を超えて初めて参照されます。あなたは@PostConstructの仕事を、ビューの上部のどこかにある<f:event type="preRenderView">と引き継ぐことができます。例えば。

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

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

ありがとうございました。そして、はい "Response already committed"は私がリダイレクト/ディスパッチを使用したかどうかに応じてエラーになりました。 preRenderViewの使用を取り除いたのは、dbとf:validateBeanなどのメタデータを持つページを動的に構成し、f:タグをpreRenderViewが呼び出される前に初期化したからです。したがって、ページの検証が正常に機能しないようにします。だから私はビューとグローバルな例外処理のIMをバッファの解決策に立ち往生を構成するプリロードされたデータが必要な場合? – user1147953

関連する問題