2015-09-04 24 views
5

クロサギ科ここ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の作成に使用されます。そのサイクルについて説明できませんでしたか?

答えて

6

サーブレットコンテナの初期化時に使用できる特別な「init FacesContext」があり、JSFの初期化中に少なくとも「a」がFacesContextになるようにします。この特殊な "init FacesContext"には、空の/ヌル/デフォルトのプロパティ、特にHTTPサーブレットのリクエスト/レスポンスに依存するプロパティが多く含まれていますが、FacesContext#getApplication()で利用可能なものなどのアプリケーションと設定に関するプロパティは、 faces-config.xml

Mojarraの場合、この "init FacesContext"はa.oのcreatedです。 com.sun.faces.config.FacesInitializerServletContainerInitializerの実装で、Webアプリケーションの起動時に実行されます。その瞬間、工場が作られます。

+0

これは、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)しかし、 –

+0

いいえ、それは 'FacesInitializer'で作成されています。私の答えで "作成された"リンクをクリックしてください。 – BalusC

+0

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