2011-07-08 9 views
5

मैं एक Bean है, एक @ManagedBean एनोटेशन, इस तरह परिभाषित किया गया साथ:जेएसएफ 2: क्या @ मैनेज्डबीन का उत्तराधिकारी होना संभव है?


@ManagedBean 
@SessionScoped 
public class Bean implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

} 

अब, मैं एक और सेम इस तरह परिभाषित किया है:


public class FooBean extends Bean { 
    // properties, methods here ... 
} 


मैं में FooBean को संदर्भित करने का प्रयास करते हैं मेरे जेएसएफ पेज, मेरे पास निम्न त्रुटि है:
Target Unreachable, identifier 'fooBean' resolved to null

जेएसएफ क्यों नहीं ई FooBean एक प्रबंधित बीन के रूप में?

उत्तर

-1

मैं इस सवाल here का उत्तर पोस्ट किया है के अंदर फिर इस

public abstract BaseBean{ 
    //... 
} 

है;)

4

क्या आपको प्रबंधित बीन होने के लिए BaseBean की आवश्यकता है? चूंकि आप इसे BaseBean नाम देते हैं, मुझे लगता है कि यह बीन आपके सभी अन्य प्रबंधित बीन के बीच समानता रखता है। यदि ऐसा है तो इसमें @ManagedBean एनोटेशन नहीं होना चाहिए। अपने प्रबंधित सेम

@ManagedBean 
@RequestScoped 
public class FooBean extends BaseBean{ 
    //... 
} 
+0

ऐसा करके, मुझे अपने सभी बीन्स पर @ManagedBean डालना होगा ... यही वह है जिसे मैं टालना चाहता हूं! – Stephan

+2

@ स्टीफन: आप अपने सभी प्रबंधित बीन पर एनोटेशन डालने से क्यों बचते हैं? मुझे नहीं पता कि आपने अपने 'बेसबीन' के अंदर क्या रखा है, लेकिन जिस तरह से आप इसे नाम देते हैं, यह सभी प्रबंधित बीन के बीच समानता का सेट होना चाहिए, इसलिए आपको इसे @ManagedBean को एनोटेट नहीं करना चाहिए क्योंकि यह वास्तव में एक नियंत्रक/गेटवे नहीं है आपका 'मॉडल'। आपके पास 'बेसबीन' को 'सत्र स्कोप्ड' होना है, इसलिए 'बेसबीन' से प्रत्येक बीन का उत्तराधिकारी सत्र होगा जिसे आप चाहते हैं या नहीं। आप सत्र में बहुत सी चीजें नहीं रखना चाहते हैं। क्या होगा यदि आप एक प्रबंधित बीन बनाना चाहते हैं जिसमें RequestScoped है और 'बेसबीन' का उत्तराधिकारी है। –

+0

अधिक स्पष्ट होने के लिए: क्या @ManagedBean का उत्तराधिकारी होना संभव है? – Stephan

7

बिंदु एलेक्स बनाने के लिए कोशिश कर रहा है कि आप कक्षाएं भ्रमित कर रहे हैं है उदाहरण के साथ। यह एक क्लासिक (पन इरादा) ओओपी गलती है।

@ManagedBean एनोटेशन कक्षाओं पर कक्षाओं पर काम नहीं करता है। यह उदाहरणों पर पर काम करता है, जो प्रबंधित होने वाले एक उदाहरण को परिभाषित करता है।

अपने सेम इस तरह परिभाषित किया गया है:

@ManagedBean 
@SessionScoped 
public class MyBean implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
} 

तो यह मतलब है कि आप एक सत्र-दायरे वाले उदाहरण, myBean कहा जाता है (या जो भी आप इसे नाम करना चाहते हैं)।

इसलिए, सभी वर्ग जो MyBean वर्ग के उप-वर्ग हैं डिफ़ॉल्ट रूप से प्रबंधित नहीं होते हैं। इसके अलावा, जेएसएफ कैसे पहचानता है कि आप सबक्लास का उपयोग कर रहे हैं? यदि हां, तो आप उन उदाहरणों को क्या नाम दे रहे हैं? (क्योंकि आप उन्हें कुछ नाम देने के लिए है, अन्यथा, उन्हें कैसे प्रबंधित JSF हैं?)

तो, मान लीजिए कि आप किसी अन्य वर्ग डालते हैं:

Class MyOtherClass { 
    private MyBean myBeanObject; // myBeanObject isn't managed. 
} 

क्या @PostConstruct और सभी अन्य एनोटेशन के लिए होता आपने इस्तेमाल किया? कुछ भी तो नहीं। यदि आपने MyBean का उदाहरण बनाया है, तो यह आप है जो इसे प्रबंधित करता है, जावासेवरफेस नहीं। तो यह वास्तव में एक प्रबंधित बीन नहीं है, केवल एक सामान्य वस्तु जिसका आप उपयोग करते हैं।

हालांकि, चीजों को पूरी तरह से बदल जब आप ऐसा करते हैं:

@ManagedBean 
@SessionScoped 
Class MyOtherClassBean { 
    @ManagedProperty("#{myBean}") 
    private MyBean myBeanObject; 

    public void setMyBeanObject(...) { ... } 
    public MyBeanClass getMyBeanObject() { ... } 
} 

फिर, क्या किया जाता है नहीं वर्ग है, लेकिन उदाहरण वर्ग की। एक प्रबंधित बीन होने का मतलब है कि आपके पास केवल उस बीन का एक उदाहरण है (प्रति गुंजाइश, वह है)।

+0

स्पष्ट स्पष्टीकरण के लिए धन्यवाद। हालांकि, http://docs.oracle.com/javaee/6/api/javax/faces/bean/ManagedBean.html का @Inherited एनोटेशन क्यों है? – Stephan

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