2010-09-14 15 views
6

में प्रबंधित बीन्स के कई उदाहरण बनाने का सही तरीका क्या है यदि मैं एक ही दायरे में अलग-अलग नामों के तहत जेएसएफ 2.0 में प्रबंधित बीन के एक से अधिक उदाहरण बनाना चाहता हूं, तो मुझे कैसे आगे बढ़ना चाहिए?जेएसएफ 2.0

@ManagedBeans({name="myManagedBean1",name="myManagedBean2"}) 
@RequestScoped 
public class MyManagedBean { 

} 

धन्यवाद ..

+0

मुझे लगता है कि जेएसएफ 2.0 एनोटेशन उतना शक्तिशाली होना चाहिए जितना चेहरे-config.xml बीन निर्माण के संबंध में पहले से ही है। मैं जेएसएफ 1.2 में एक ही कक्षा के कई सेम का उपयोग कर रहा हूं और यह एक दयालु जेएसएफ 2.0 एनोटेशन के साथ इस सुविधा को दूर नहीं करता है। – Puche

उत्तर

10

आप नहीं कर सकते हैं: आदर्श रूप में, मैं करने के लिए (उदाहरण के लिए) बराबर करना चाहते हैं। यह तकनीकी रूप से भी ज्यादा समझ में नहीं आता है। आप शायद विशेष कार्यात्मक आवश्यकता के लिए गलत दिशा में समाधान की तलाश कर रहे हैं।

आपकी सबसे अच्छी शर्त माता-पिता बीन रखना है और बच्चों के रूप में उन "एकाधिक सेम" हैं।

@ManagedBean 
@RequestScoped 
public class Parent { 
    private Child child1; 
    private Child child2; 
    // ... 
} 

ताकि आप इसे #{parent.child1} और #{parent.child2} द्वारा पहुँच सकते हैं। आप निश्चित रूप से List<Child> संपत्ति या Map<String, Child> का उपयोग अधिक लचीला होने के लिए भी कर सकते हैं।

faces-config.xml के साथ एक अलग नाम के साथ कई बीन कक्षाओं को परिभाषित करना संभव है। फिर भी, मैं नहीं देखता कि यह कैसे उपयोगी है।

+0

धन्यवाद। आवश्यकताएं प्रबंधित घटकों से कस्टम घटकों के लिए बीन्स का समर्थन करने के सवाल में उत्पन्न होती हैं, जिनमें कुछ फ़ील्ड पृष्ठ पर यूआईसीओम्पोनेंट्स से बंधे होते हैं। इस प्रकार (दुर्लभ अवसरों पर albiet), मुझे इस मामले में यूआई संवाद में, एक ही घटक के लिए एक ही प्रकार के बैकिंग बीन के कई उदाहरण की आवश्यकता है। मैंने सोचा कि आपका समाधान मामला हो सकता है, लेकिन फिर यह @PostConstruct जैसे जीवन चक्र एनोटेशन का उपयोग करने में असमर्थ रहता है। धन्यवाद! – Dave

+0

आप ** ** एक प्रबंधित बीन के कई उदाहरण बना सकते हैं (प्रबंधित BeanELResolver's * getValue * को ओवरराइड करें)। वे उसी बीनबिल्डर और बीनमेनगर का उपयोग करके निर्माण करेंगे, वे सिर्फ अपने बीननाम में भिन्न हैं। यदि यह आपके समाधान के लिए आवश्यक है, तो मुझे नहीं पता। कुछ दुर्लभ मामलों में, मैं हाँ कहूंगा। – Manuel

+0

@ मैनुअल: निश्चित रूप से यह संभव है। मुख्य उत्तर सिर्फ लक्ष्य प्राप्त करने के लिए जेएसएफ 2.0 एनोटेशन का उपयोग करने पर लागू होता है, ठीक उसी तरह ओपी ने पूछा। ध्यान दें कि उत्तर के अंतिम अनुच्छेद में कहा गया है कि पुराने 'चेहरे-config.xml' तरीके का उपयोग करते समय कई उदाहरणों को परिभाषित करना संभव है। इसके लिए आपको जेएसएफ निहित विशिष्ट वर्गों को हैक करने की आवश्यकता नहीं है। – BalusC

3

आपके मामले में आपको चेहरे-config.xml का उपयोग करना चाहिए। प्रबंधित बीन और RequestScope एनोटेशन के बिना अपने बीन को लागू करें। तो आपका बीन प्रति डिफ़ॉल्ट रूप से एक प्रबंधित बीन नहीं बन जाएगा। आप उदाहरण के मुकाबले ज्यादा प्रबंधित कर सकते हैं क्योंकि आपको अलग-अलग नामों, अलग-अलग क्षेत्रों और पट्टे पर अलग-अलग गुणों की आवश्यकता होती है। उदाहरण के लिए:

<managed-bean> 
    <managed-bean-name>MyManagedBean1</managed-bean-name> 
    <managed-bean-class>org.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
    <managed-property> 
     <property-name>value1</property-name> 
     <property-class>int</property-class> 
     <value>5</value> 
    </managed-property> 
    <managed-property> 
     <property-name>value2</property-name> 
     <property-class>int</property-class> 
     <value>2</value> 
    </managed-property> 
</managed-bean> 

<managed-bean> 
    <managed-bean-name>MyManagedBean2</managed-bean-name> 
    <managed-bean-class>org.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
    <managed-property> 
     <property-name>value1</property-name> 
     <property-class>int</property-class> 
     <value>30</value> 
    </managed-property> 
    <managed-property> 
     <property-name>value2</property-name> 
     <property-class>java.lang.String</property-class> 
     <value>project</value> 
    </managed-property> 
</managed-bean> 

लगता है कि वर्णनकर्ता बुराई कर रहे हैं और एनोटेशन आपके कोड को लागू करने के लिए एक ही रास्ता नहीं हैं।

3

एक संभावना है कि आप अपनी कक्षा को अमूर्त बना दें और इसे जितना आवश्यक हो उतने नामित उदाहरणों में विभाजित करें, जिसे आप खाली छोड़ सकते हैं। यह आपको भविष्य में प्रबंधित बीन कार्यक्षमता को अलग करने में भी मदद करेगा जो वास्तव में केवल एक मामले से संबंधित है।

आपको सभी उप-वर्गों में @ManagedBean (और स्कोप) एनोटेशन को स्थानांतरित करना होगा, अफसोस की बात है, भले ही यह @Inherited है। मोजाररा के वर्तमान संस्करण के लिए कम से कम, दूसरों को मैं नहीं जानता।

+0

उपरोक्त मेरे उपयोग के मामले में, मैंने इस दृष्टिकोण के साथ जाने का फैसला किया क्योंकि प्रत्येक अलग-अलग वेब पेज के लिए अलग-अलग इनिट केस हैं। धन्यवाद। – user3586195

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