2012-06-26 14 views
9

मेरे पास एक बेसबियन है जो @ पोस्टस्टोनस्ट्रक्चर के साथ है, और एक बीन इसे विस्तारित करता है जिस पर मैं एक और @ पोस्टकस्ट्रक्चर को कॉल करना चाहता हूं। मैंने कई जगहें पढ़ी हैं जहां यह कहा गया था कि यह संभव था, हालांकि, ऐसा लगता है कि विस्तारित वर्ग पर @ पोस्ट कॉन्स्ट्रक्ट को पहले कहा जाता है (यदि दूसरा बिल्कुल कहा जाता है)। मैं फिर "संदर्भ" पर एक एनपीई प्राप्त करता हूं क्योंकि मुझे लगता है कि सुपर बीन का पोस्टकॉन्स्ट्रक्ट पहले से ही बुलाया जा चुका है।सुपर बीन पर @PostConstruct को कॉल करना और बीन

क्या यह सक्षम है? यदि हां, तो मैं गलत क्या कर रहा हूं?

बेस सेम:

@ManagedBean 
@RequestScoped 
public class BaseBean { 
@ManagedProperty(value = "#{contextBean}") 
    private ContextBean contextBean; 
    Context context; 
@PostConstruct 
public void setupContext() { 
    context = getContextBean().getContext(); 
} 

विस्तार सेम:

@ManagedBean 
@RequestScoped 
public class SmartBoxSearchBean extends BaseBean { 
@PostConstruct 
public void setUp() { 
    jsonHelper = context.get(SmartBoxJsonHelper.class); 
} 

धन्यवाद, Yotam।

+0

@YotamSeon मैं एक बहुत ही इसी तरह की समस्या [यहां] है (http://stackoverflow.com/q/29787068/330457)। क्या आपने निष्कर्ष निकाला था कि स्वीकार्य सुझाव ही एकमात्र समाधान है जिसे आप कर सकते हैं? –

उत्तर

10

बैकिंग बीन के सुपरक्लास के @PostConstruct को प्रबंधित बीन के निर्माण के समय बिल्कुल नहीं कहा जाता है। इसे केवल तब कहा जाता है जब पूरी तरह अलग उस सुपरक्लास का प्रबंधित बीन उदाहरण उदा। अपने मामले में ईएल में #{baseBean} का उपयोग करना। आप प्रभावी रूप से प्रबंधित बीन कक्षा पर स्वतंत्र रूप से दो 0 पूरी तरह से अलग उदाहरण #{baseBean} और #{smartBoxSearchBean} के साथ समाप्त होते हैं, जिसमें कक्षा @PostConstruct विधि स्वतंत्र रूप से प्रबंधित बीन कक्षा पर आती है।

यह डिज़ाइन कुछ हद तक अजीब है। एक बैकिंग बीन का एक सुपरक्लास आमतौर पर प्रबंधित बीन के रूप में उपयोग नहीं किया जाता है।

public abstract class BaseBean { 

    @ManagedProperty("#{contextBean}") 
    private ContextBean contextBean; 

    public Context getContext() { 
     return contextBean.getContext(); 
    } 

} 

और

@ManagedBean 
@RequestScoped 
public class SmartBoxSearchBean extends BaseBean { 

    @PostConstruct 
    public void setUp() { 
     jsonHelper = getContext().get(SmartBoxJsonHelper.class); 
    } 

} 

या हो सकता है यह, आप सभी

public abstract class BaseBean { 

    @ManagedProperty("#{contextBean.context}") 
    private Context context; 

    public Context getContext() { 
     return context; 
    } 

} 
पर अन्य प्रयोजनों के लिए ContextBean की जरूरत नहीं है, तो:

मैं इस प्रकार अपने दृष्टिकोण को संशोधित करने के लिए सुझाव

ध्यान दें कि @ManagedProperty सुपरक्लास में घोषित होने पर ठीक काम करता है मार्ग।


अद्यतन: कार्यात्मक जरूरतों पर निर्भर करता है, आप भी सेम दसगुणा कर सकते हैं और सिर्फ {smartBoxSearchBean} में #{baseBean} इंजेक्षन।

@ManagedBean 
@RequestScoped 
public class BaseBean { 

    @ManagedProperty("#{contextBean}") 
    private ContextBean contextBean; 
    private Context context; 

    @PostConstruct 
    public void init() { 
     context = contextBean.getContext(); 
    } 

} 

और

@ManagedBean 
@RequestScoped 
public class SmartBoxSearchBean { 

    @ManagedProperty("#{baseBean}") 
    private BaseBean baseBean; 

    @PostConstruct 
    public void setUp() { 
     jsonHelper = baseBean.getContext().get(SmartBoxJsonHelper.class); 
    } 

} 
+1

सुपर त्वरित उत्तर के लिए धन्यवाद BalusC। आपका समाधान एक मुद्दा को छोड़कर काम करेगा - बेसबीन के पोस्टकॉन्स्ट्रक्ट में मैं अन्य सदस्यों को भी शुरू करता हूं, विस्तारित सेम का उपयोग ... –

+0

उत्तर अपडेट देखें। – BalusC

+0

फिर से धन्यवाद, कार्यान्वित! –