2015-09-04 8 views
5

Mojarra 2.2.12समझौता FacesContext प्रारंभ विवरण

यहाँ FacesContext की इन्स्टेन्शियशन पदभार संभालने के कोड का टुकड़ा है। एक बार हमें अनुरोध मिलने के बाद, हम इससे वैश्विक जानकारी प्राप्त करते हैं और इसका उपयोग करके FacesContext इंस्टेंस बनाते हैं। तो, प्रत्येक अनुरोध के लिए उदाहरण बनाया गया है। लेकिन facesContextFactory के इरादे को प्राप्त करना मुझे और अधिक मुश्किल लग रहा था।

// Acquire our FacesContextFactory instance 
try { 
    facesContextFactory = (FacesContextFactory) 
     FactoryFinder.getFactory 
     (FactoryFinder.FACES_CONTEXT_FACTORY); 
} catch (FacesException e) { 
    //others 
} 

कहाँ FactoryFinder के लिए

String javax.faces.FactoryFinder.FACES_CONTEXT_FACTORY = "javax.faces.context.FacesContextFactory" 

Javadocs इसलिए सभी कारखाने वस्तुओं जावा सर्वर में निर्दिष्ट के लिए

मानक खोज एल्गोरिथ्म बुलाया का वर्णन एपीआई चेहरे।

यह है कि मैं क्या से उलझन में था। javax.faces.FactoryFinderInstance#getFactory(String factoryName)

try { 
     factoryOrList = factories.get(factoryName); 
     if (!(factoryOrList instanceof List)) { 
      return factoryOrList; 
     } 
} finally { 
     lock.readLock().unlock(); 
} 

factories क्षेत्र आरंभ नहीं हो जाता के रूप में इस प्रकार है copyInjectionProviderFromFacesContext():

अब, चलो वास्तविक तरीका है कि कारखाने उदाहरण बनाता है पर विचार करें

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" है जो सर्वलेट कंटेनर प्रारंभिकरण के दौरान उपलब्ध है, यह सुनिश्चित करना कि जेएसएफ प्रारंभ के दौरान कम से कम "ए" FacesContext है। इस विशेष "init FacesContext" ए.ओ. के आधार पर पहले से ही उपलब्ध कर रहे हैं खाली/बातिल/डिफ़ॉल्ट गुण, विशेष रूप से इस तरह के FacesContext#getApplication() के माध्यम से उपलब्ध लोगों के रूप में पर HTTP सर्वलेट अनुरोध/प्रतिक्रिया है, लेकिन आवेदन और विन्यास संबंधित गुणों के आधार लोगों का एक बहुत कुछ है faces-config.xml

Mojarra के मामले में, इस "init FacesContext" ए.ओ. में created है com.sun.faces.config.FacesInitializer, एक ServletContainerInitializer कार्यान्वयन जो वेबपैड स्टार्टअप के दौरान चलता है। उस पल के दौरान कारखानों का निर्माण किया जाता है।

+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/ संदर्भ/FacesContext.java # FacesContext.getCurrentInstance% 28% 29) हालांकि ... –

+0

नहीं, यह 'FacesInitializer' में बनने वाले। मेरे उत्तर में "बनाए गए" लिंक पर क्लिक करें। – BalusC

+0

मैं जीएफएफ से संबंधित त्रुटि प्राप्त कर रहा हूं जब जीएफ 4.1.1 पर स्प्रिंग ऐप चलाने के लिए मोजररा के किसी भी संदर्भ के बिना: जानकारी: वेब मॉड्यूल [शून्य] ServletContext.log(): क्लासपाथ जानकारी पर कोई वसंत वेब अनुप्रयोग प्रारंभिक प्रकार नहीं मिला : Mojarra 2.2.12 शुरु कर रहा है संदर्भ के लिए '/sm-shop-2.0.3-SNAPSHOT' गंभीर: init समय FacesContext से InjectionProvider प्राप्त करने में असमर्थ। क्या यह कंटेनर मोजरा इंजेक्शन एसपीआई लागू करता है? गंभीर: @PreDestroy एनोटेटेड विधियों को कॉल करने में असमर्थ क्योंकि कोई इंजेक्शनप्रोवाइडर नहीं पाया जा सकता है। क्या यह कंटेनर मोजरा इंजेक्शन एसपीआई लागू करता है? – developer10

संबंधित मुद्दे