2010-11-29 11 views
5

before-invokeApplication-phaselistenerで実行対象の管理対象ビーンへの参照を取得することはできますか?JSF 2:フェーズ・リスナー・オブジェクトのマネージドBeanのインスタンスへのアクセス?

アプリケーション起動フェーズの前に、どのmanagedBeanがメソッドを実行するのかを明確にする必要があります。

この例では、1 jsfページを処理する1つのメイン管理Beanがあるとします。

だから私は必要なもの基本的には次のとおりです。

  1. メニュー
  2. からのユーザーのアクセスプログラムそれは、メニューからアクセスしていますので、メインの管理Beanのinit()メソッドが用意ような原料を初期化するために呼び出されますデータは、認証チェックをやって
  3. 以降の提出は、ポイント#を実装するには、メニューから

を再アクセスされるまで、もうinit()メソッドを呼び出す必要がいけません2、フェーズの1つを傍受しようと考えています

フェーズの実装でマネージドBeanを取得することに関するAPIドキュメントをチェックしましたが、何も見つかりませんでした。

@PostConstructやマネージドBeanのコンストラクタでこれを行うことができたことがわかりましたが、初めてBeanが構築されたときにのみ行い、jsfが呼び出されるたびにメソッドを呼び出す必要があります。メニューからアクセスします。

提案がありますか?

よろしく、
アルバート・カム

答えて

3

あなたはELContext/ELResolverを経由して管理対象Beanにアクセスすることができます。これはMyFaces wikiでよく説明されています(vanilla JSFでも動作します)。例えば

ELContext elContext = FacesContext.getCurrentInstance().getELContext(); 
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication() 
    .getELResolver().getValue(elContext, null, "neededBean"); 

は更なる説明、及び他のJSFバージョンの実装のためMyFaces wiki entryを参照してください。

@PostConstructを使用するあなたの考えは良いものです。スコープを@ViewScopedが好きなものに変更することを検討してください。そのビューにナビゲートするたびにロジックが実行されます。

また、PreRenderViewEvent(JSF 2の場合)をご覧ください。このコードは、あなたのFaceletページに埋め込まれています。

<f:metadata> 
<f:viewParam name="foo" value="#{bean.foo}"/> 
<f:event type="preRenderView" listener="#{bean.doSomething}"/> 
</f:metadata> 

f:イベントリスナーはすべてのページビューの前に実行されます。

+0

多くのオプションがあります。ありがとうございました ! – bertie

+1

アクションメソッドに含まれていたインスタンスを返す方法がわかりません。あなたのアプローチでは、あらかじめBeanの名前がわかっている必要があります。ちなみに、私は['Application#evaluateExpressionGet()'](http://download.oracle.com/javaee/6/api/javax/faces/application/Application.html#evaluateExpressionGet%28javax.faces.context .FacesContext、%20java.lang.String、%20java.lang.Class%29)は 'ELResolver/ELContext'の代わりに省略しています。 [この回答](http://stackoverflow.com/questions/2633112/jsf-get-managed-bean-by-name)も参照してください。 – BalusC

+0

まあ、フェーズ・リスナーがbefore invokeアプリケーション・フェーズでリスニングしている場合、フェーズ・リスナーはオブジェクト・インスタンスをインスタンス化します。この同じインスタンスは、マネージド・ビー・ビーがまだスコープ内にある(同じ要求)ため、アプリケーション・メソッド(アプリケーション・フェーズの呼び出し中に呼び出される)で参照されます。私はそれを行う方法の問題に答えましたが、私はそれを最良の解決策として主張していません。最終目標を達成するのに適した代替案を提供しました。 –

関連する問題