クロサギ科ここ2.2.12理解のFacesContextインスタンスの詳細
はFacesContextのインスタンス化を引き継ぐコードの一部です。要求が出されると、そこからグローバルな情報を取得し、それを使用してFacesContext
インスタンスを作成します。したがって、インスタンスはリクエストごとに作成されます。しかし、facesContextFactory
のインテンシブを得ることは、はるかにトリッキーなようでした。
// Acquire our FacesContextFactory instance
try {
facesContextFactory = (FacesContextFactory)
FactoryFinder.getFactory
(FactoryFinder.FACES_CONTEXT_FACTORY);
} catch (FacesException e) {
//others
}
どこ
String javax.faces.FactoryFinder.FACES_CONTEXT_FACTORY = "javax.faces.context.FacesContextFactory"
のJavaDoc FactoryFinder
ため のJavaServer FacesのAPIをで指定したすべてのファクトリオブジェクトのための、いわゆる
標準発見アルゴリズムを記述しています。
これは私が混乱していたものです。
今、のは、工場出荷時のインスタンスを作成し、実際の方法を検討してみましょう:copyInjectionProviderFromFacesContext()を次のようにfactories
フィールドが初期化されたjavax.faces.FactoryFinderInstance#getFactory(String factoryName)
try {
factoryOrList = factories.get(factoryName);
if (!(factoryOrList instanceof List)) {
return factoryOrList;
}
} finally {
lock.readLock().unlock();
}
を:
private void copyInjectionProviderFromFacesContext() {
InjectionProvider injectionProvider = null;
FacesContext context = FacesContext.getCurrentInstance(); //USE FACES CONTEXT!!!!!
if (null != context) {
injectionProvider = (InjectionProvider) context.getAttributes().get("com.sun.faces.config.ConfigManager_INJECTION_PROVIDER_TASK");
}
if (null != injectionProvider) {
factories.put(INJECTION_PROVIDER_KEY, injectionProvider);
} else {
if (LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.log(Level.SEVERE, "Unable to obtain InjectionProvider from init time FacesContext. Does this container implement the Mojarra Injection SPI?");
}
}
}
ので、使用FacesContext
インスタンスを作成しますが、ファクトリ自体はFacesContext
の作成に使用されます。そのサイクルについて説明できませんでしたか?
これは、InitFacesContextを作成する場合です。 'FacesContextFactory privateFacesContextFactory =(FacesContextFactory)FactoryFinder.getFactory(" com.sun.faces.ServletContextFacesContextFactory ");'? [Mojarra 2.2.4](http://grepcode.com/file/repo1.maven.org/maven2/com.sun.faces/jsf-api/2.2.4/javax/faces/)には表示されません。 context/FacesContext.java#FacesContext.getCurrentInstance%28%29)しかし、 –
いいえ、それは 'FacesInitializer'で作成されています。私の答えで "作成された"リンクをクリックしてください。 – BalusC
Mojarraへの参照なしでGF 4.1.1上でSpringアプリケーションを実行しようとするとJSF関連のエラーが発生する: Info:WebModule [null] ServletContext.log():いいえSpring WebApplicationInitializerタイプがクラスパスで検出されました Info :コンテキスト '/sm-shop-2.0.3-SNAPSHOT'のMojarra 2.2.12の初期化 重大:初期化時のFacesContextからInjectionProviderを取得できません。このコンテナはMojarra Injection SPIを実装していますか? 重大:InjectionProviderが見つからないため、@PreDestroy注釈付きメソッドを呼び出すことができません。このコンテナはMojarra Injection SPIを実装していますか? – developer10