2012-04-26 15 views
2

FaceletContextを取得できないJSF 2.0プロジェクトがあります。ここでFaceletContextがNullです

は私のweb.xmlからセットアップです:

<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
</context-param> 

<context-param> 
    <param-name>facelets.DEVELOPMENT</param-name> 
    <param-value>true</param-value> 
</context-param> 

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 

<context-param> 
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> 
    <param-value>false</param-value> 
</context-param> 

<context-param> 
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name> 
    <param-value>/index.xhtml</param-value> 
</context-param> 
<context-param> 
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
    <param-value>.xhtml</param-value> 
</context-param> 

<context-param> 
    <param-name>javax.faces.application.CONFIG_FILES</param-name> 
    <param-value>/WEB-INF/faces-config.xml</param-value> 
</context-param> 

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/faces/*</url-pattern> 
</servlet-mapping> 

私はFaceletContextのFacesContextを得ることはできませんが。次のコード行で問題が解決します:

  FacesContext fctx = FacesContext.getCurrentInstance(); //works 
    //FaceletContext f2ctx = (FaceletContext) fctx.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY); 
    FaceletContext f2ctx = (FaceletContext) fctx.getELContext().getContext(FaceletContext.class); 

誰でも手助けできますか?

更新:オンデマンドでダイアログを含むにfaceletファイルをロードし、表示するために、親にそれを追加します。

上記は私の全体的な目標からの抜粋でした。以下のコードは不完全ですが、私が何を得ているのかを説明する必要があります。アプリケーションはPrimefacesライブラリを使用しているため、RequestContextオブジェクトを使用しています。

public void launch() { 

    form.getChildren().clear(); 

    FacesContext fctx = FacesContext.getCurrentInstance(); 
    for (Object o: fctx.getAttributes().keySet()) { 
     System.out.println(o.toString()); 
    } 

    FaceletContext f2ctx = (FaceletContext) fctx.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY); 
    //FaceletContext f2ctx = (FaceletContext) fctx.getELContext().getContext(FaceletContext.class); 
    dialog = new Dialog(); 

    try { 
     f2ctx.includeFacelet(dialog, "/WEB-INF/facelets/dialog/manager.xhtml"); 
     form.getChildren().add(dialog); 
    } catch (IOException ex) { 
     log.debug(ex.toString()); 
    } 

    RequestContext.getCurrentInstance().update("mainPageCenterForm"); 
} 

答えて

1

ビューがこれまでに構築されている前にそれにアクセスしようとすると、それはnullになります。例えば、beforePhaseの間は、RESTORE_VIEWの相である。コードロジックを並べ替えます。機能的な要件は何か、どこにアクセスしようとしているのかははっきりしないので、より適切な回答はできません。具体的な問題へ


無関係部分状態保存が無効になっているとき、javax.faces.FULL_STATE_SAVING_VIEW_IDSコンテキストparamがを無視されます。おそらくそれはあなたの意図ではありませんでしたか?この関連する回答を参照してくださいShould PARTIAL_STATE_SAVING be set to false?

+0

この問題を指摘してくれてありがとうございました、いくつかの実験から残っていました。私は、全面的な方法と私がしようとしていることの説明を加えました。残念ながら、私は動的UIを使用することはできません:私が必要とするものを含める。 – Jason

+0

正確には 'launch()'が呼ばれますか? 'FacesContext#getViewRoot()'と 'FacesContext#getCurrentPhaseId()'をデバッグ/プリントするとどうなるでしょうか? – BalusC

+0

なぜそれがnullであるかあなたのポイントを見ています。起動メソッドはPrimefaces MenuItemのアクションとして呼び出されていますが、別のページ(index.xhtml)で定義されています。しかし、アプリケーションはダイアログが重いので(顧客の要件)、関連するFaceletの要求に応じて負荷をかける方法を理解しようとしています。 – Jason