12

4 つのバッキング Bean で @PostConstruct にリダイレクトを作成したいと考えています。次の質問から学んだように、 JSF PostConstruct Exception Handling - Redirect を使用することになっていることを知っています。

    @PostConstruct
    public void init() {    
       if (shouldRedirect) {
          try { 
             FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");
             return;
          } catch (IOException e) {
             //do nothing
          }
        }
        ....
     }

これは、私の 2 つのバッキング Bean ではうまく機能しますが、他の 2 つでは、リダイレクトされていない xhtml ファイルがまだバッキング Bean を呼び出しており、リダイレクトしません。バッキング Bean が実際に両方FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");とリターンを呼び出すことを (デバッグで) 確認しました。ステートメント。

何が間違っている可能性がありますか?

4

1 に答える 1

26

応答がすでにコミットされている場合、でのリダイレクトは@PostConstruct遅すぎる可能性があります。つまり、応答の最初の数バイトがすでにクライアントに送信されている場合です。これはノーリターンのポイントです。これは、バッキングBeanがビューの比較的遅い位置で初めて参照された(したがって構築された)ときに発生する可能性があります。

これは、次のいずれかの方法で解決できます。

  1. ビューでできるだけ早くBeanを参照します。

  2. <f:event type="preRenderView">の代わりに使用してください@PostConstruct。これにより、レンダリング応答が開始する直前(つまり、ビットが応答に送信される前)にメソッドが呼び出されます。または、すでにJSF 2.2を使用している場合は、を使用し<f:viewAction>ます。追加の利点は、をいじる必要がない<f:viewAction>ように、ナビゲーションケースの結果を返すことができることです。return bolagsSok_company?faces-redirect=true"ExternalContext#redirect()

  3. javax.faces.FACELETS_BUFFER_SIZEコンテキストパラメータによってデフォルトのFaceletsバッファサイズをweb.xml最大のHTML応答のサイズ程度に増やします。

参照:

于 2012-08-28T21:59:53.637 に答える