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");
}
この問題を指摘してくれてありがとうございました、いくつかの実験から残っていました。私は、全面的な方法と私がしようとしていることの説明を加えました。残念ながら、私は動的UIを使用することはできません:私が必要とするものを含める。 – Jason
正確には 'launch()'が呼ばれますか? 'FacesContext#getViewRoot()'と 'FacesContext#getCurrentPhaseId()'をデバッグ/プリントするとどうなるでしょうか? – BalusC
なぜそれがnullであるかあなたのポイントを見ています。起動メソッドはPrimefaces MenuItemのアクションとして呼び出されていますが、別のページ(index.xhtml)で定義されています。しかし、アプリケーションはダイアログが重いので(顧客の要件)、関連するFaceletの要求に応じて負荷をかける方法を理解しようとしています。 – Jason