コードがFacesContextを呼び出す場合、JSF リクエスト ライフサイクルに関連付けられたスレッドの外では機能しません。リクエストごとに FacesContext オブジェクトが作成され、リクエストの最後に破棄されます。静的呼び出しを介してフェッチできる理由は、リクエストの開始時にThreadLocalに設定されているためです。FacesContext のライフサイクルは、ServletContext のライフサイクルとは関係ありません。
これでは不十分かもしれませんが (すでにこのルートをたどっているように聞こえます)、ServletContextListener を使用して、必要なことを実行できるはずです。FacesContext へのすべての呼び出しが JSP の要求スレッドに保持されていることを確認してください。
web.xml:
<listener>
<listener-class>appobj.MyApplicationContextListener</listener-class>
</listener>
実装:
public class MyApplicationContextListener implements ServletContextListener {
private static final String FOO = "foo";
public void contextInitialized(ServletContextEvent event) {
MyObject myObject = new MyObject();
event.getServletContext().setAttribute(FOO, myObject);
}
public void contextDestroyed(ServletContextEvent event) {
MyObject myObject = (MyObject) event.getServletContext().getAttribute(
FOO);
try {
event.getServletContext().removeAttribute(FOO);
} finally {
myObject.dispose();
}
}
}
このオブジェクトは、JSF アプリケーション スコープを介して (または、同じ名前の変数が他に存在しない場合は直接) アドレス指定できます。
<f:view>
<h:outputText value="#{applicationScope.foo.value}" />
<h:outputText value="#{foo.value}" />
</f:view>
JSF マネージド Bean でオブジェクトを取得する場合は、ExternalContextから取得できます。
FacesContext.getCurrentInstance()
.getExternalContext().getApplicationMap().get("foo");