2013-01-05 32 views
9

शायद मेरा प्रश्न एक छोटा सा है, लेकिन मैंने पहले कभी भी एप्लिकेशन स्कोप बीन का उपयोग नहीं किया था। मुझे एप्लिकेशन बीन की आवश्यकता है क्योंकि मुझे डेटाबेस पर समय लेने वाले लेनदेन करना है। मेरी खोज ने मेरी जिज्ञासा पूरी नहीं की। मुझे नहीं पता कि क्यों, लेकिन मैंने बीन (यह शून्य है) शुरू करने का प्रबंधन नहीं किया था या यह ऐप दुर्घटनाग्रस्त हो गया था। तो मैं एक आवेदन गुंजाइश सेमजेएसएफ एप्लिकेशन स्कोप तत्कालता और इंजेक्शन

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 
... 
} 

उत्सुक = true मैंने पढ़ा है कि JSF बताता सेम हर बार शुरू करने के लिए जब आवेदन सर्वर (मैं ग्लासफिश का उपयोग करें) शुरू कर दिया है।

मैंने कई स्थानों पर पढ़ा है कि मुझे बस इस एनोटेशन को रखना है और बीन शुरू हो गया है। मेरे लिए यह नहीं करता है ... के बाद मैंने पढ़ा है मैं @PostConstuct एनोटेशन

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @ManagedProperty(value = "#{container}") 
    private ApplicationContainer container; 

    @PostConstruct 
    public void init() { 
    container.contructContainer(); 
    } 

इस दूसरे सेम है कि मैं इंजेक्षन में त्रुटि देता का उपयोग करना होगा अगर मैं एक और सेम में आवेदन सेम इंजेक्षन करना चाहते हैं टेस्टबीन ...

  • यदि आवेदन शुरू होता है तो एप्लिकेशन बीन प्रारंभ होता है जब यह एप्लिकेशन के शरीर में कौन सी विधि को कॉल करता है, इसे क्रियाओं को करने के लिए कौन सा तरीका कॉल करता है? या इंजेक्शन बीन में यह पोस्ट निर्माण विधि में किया जाता है?

कृपया मुझे एप्लिकेशन बीन्स को संभालने का उचित तरीका बताएं। मैं वास्तव में उलझन में हूं ...

आपके समय के लिए धन्यवाद!

उत्तर

21

2 संभावित गलतियां हैं।

सबसे पहले, @ManagedBean(eager=true) काम करता है, its javadoc कहता है, केवल एप्लिकेशन पर जेएसएफ प्रबंधित बीन्स स्कॉप्ड किया जाता है। तो यह तभी काम करता है जब आपने @ApplicationScopedjavax.faces.bean पैकेज का उपयोग किया है (और इस प्रकार javax.enterprise.context पैकेज नहीं है!)। eager=true का मूल रूप से अर्थ है कि बीन को वेबपैप के स्टार्टअप पर केवल बाद में ही ऑटो-इंस्टीट्यूट किया जाएगा जब इसे ईएल में पहली बार संदर्भित किया जाएगा।

दूसरा, प्रबंधित बीन नाम जावबीन्स विनिर्देश के अनुसार decapitalized रूप में classname के लिए डिफ़ॉल्ट है। आपने @ManagedBean(name="container", eager=true) जैसे किसी भी प्रबंधित बीन नाम को स्पष्ट रूप से निर्दिष्ट नहीं किया है, इसलिए प्रबंधित बीन नाम applicationContainer पर डिफ़ॉल्ट होगा, फिर भी आप #{applicationContainer} के बजाय इसे #{container} के रूप में संदर्भित करने का प्रयास कर रहे हैं।

आप जिस समस्या का सामना कर रहे हैं, उस पर आप बिल्कुल स्पष्ट नहीं हैं। यदि आपको अपवाद मिल रहा है, तो आपको इसे पूरी तरह से पढ़ना/समझना चाहिए और यदि आप इसे समझने में असमर्थ हैं, तो इसे पूरी तरह से कॉपी करें- स्टैकट्रैक को शामिल करें- प्रश्न में। यह आपकी समस्या के पूरे उत्तर का अर्थ है। आपको बस इसे समझना और समझना है (या हमें इसे आम आदमी के शब्दों में समझा देना है)। आपको वास्तव में उन्हें अनदेखा नहीं करना चाहिए और उन्हें प्रश्न से बाहर छोड़ देना चाहिए जैसे कि वे अप्रासंगिक सजावट हैं। वो नहीं हैं!

सभी के साथ सभी, पूर्ण और उचित दृष्टिकोण होगा, पूरा साथ आयात घोषणाओं बस सुनिश्चित करने के लिए, और डिबगिंग के लिए भी कुछ गरीब आदमी का stdout प्रिंट:

package com.example; 

import javax.faces.bean.ApplicationScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean(eager=true) 
@ApplicationScoped 
public class ApplicationContainer { 

    public ApplicationContainer() { 
     System.out.println("ApplicationContainer constructed"); 
    } 

} 
package com.example; 

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class TestsBean implements Serializable { 

    @ManagedProperty("#{applicationContainer}") 
    private ApplicationContainer container; 

    public TestsBean() { 
     System.out.println("TestsBean constructed"); 
    } 

    @PostConstruct 
    public void init() { 
     System.out.println("ApplicationContainer injected: " + container); 
    } 

    public void setContainer(ApplicationContainer container) { 
     this.container = container; 
    } 

} 
+0

के लिए आप BalusC धन्यवाद अपने पर्याप्त जवाब मैंने इस सवाल में अपना अपवाद नहीं रखा है क्योंकि मैं एक सामान्य प्रश्न बनना चाहता था, विशिष्ट नहीं। मैंने सोचा था कि एप्लिकेशन स्कोप बीन्स को एक और विशिष्ट, अलग-अलग प्रारंभिक आवश्यकता होती है और मुझे उचित प्रारंभिक, बस बिट्स और टुकड़े नहीं मिलते हैं। फिर से आपके समय के लिए धन्यवाद! – CyberGriZzly