2012-01-31 12 views
16

मैं ग्लासफ़िश 3.0 के साथ जेएसएफ 2.0 का उपयोग कर रहा हूं।@PostConstruct विधि को उसी अनुरोध के लिए दो बार बुलाया जाता है

मैं निम्नलिखित बीन कामयाब रहे:

@ManagedBean 
@RequestScoped 
public class OverviewController{ 

    private List<Event> eventList; 

    @PostConstruct 
    public void init(){ 
     System.out.println("=> OverviewController - init() - enter"); 

     System.out.println("=< OverviewController - init() - exit"); 
    } 
} 

overview.xhtml फ़ाइल से मैं अपने OverviewController से अलग-अलग विशेषताओं या तरीकों फोन कर रहा हूँ।

<ui:repeat var="event" value="#{overviewController.eventList}"> 
    ... 
</ui:repeat> 

सब कुछ बस ठीक काम करता है लेकिन समस्या यह लॉग फ़ाइल पर है:

INFO: Enter : RESTORE_VIEW 1 
INFO: Exit : RESTORE_VIEW 1 

INFO: Enter : RENDER_RESPONSE 6 
INFO: => OverviewController - init() - enter 
INFO: => Overview Controller - updateSelectedTab() - enter 
INFO: =< Overview Controller - updateSelectedTab() - exit 
INFO: =< OverviewController - init() - exit 
INFO: => OverviewController - init() - enter 
INFO: => Overview Controller - updateSelectedTab() - enter 
INFO: =< Overview Controller - updateSelectedTab() - exit 
INFO: =< OverviewController - init() - exit 
INFO: Exit : RENDER_RESPONSE 6 

आप देख सकते हैं, init() विधि का कोई कारण नहीं क्या तो हमेशा के लिए एक ही अनुरोध में दो बार कहा जाता है । जो मुझे पता है, पोस्टकॉन्स्ट्रक्चर के साथ एनोटेटेड किसी भी विधि को प्रत्येक अनुरोध के लिए बुलाया जाता है। क्या मै गलत हु?

संपादित करें: पृष्ठ पर कोई AJAX का उपयोग नहीं किया जाता है। मैंने फायरबग के साथ अनुरोधों की संख्या की जांच की। javax.faces.resource (जीईटी) के लिए

  • 1.One
  • सीएसएस फ़ाइल के लिए 2.One (जीईटी)
  • अवलोकन के लिए 3.One: पेड़ बनाया अनुरोध नहीं है .xhtml (जीईटी)
+0

आप ClassFish या ग्लासफिश मतलब हैं? – Kushan

+0

@ कुशन ग्लासफ़िश – Ionut

+0

क्या आप कोई अजाक्स कॉल कर रहे हैं? वास्तव में ब्राउजर वास्तव में कितने अनुरोध कर रहा है यह जानने के लिए फ़ायरबग या इसी तरह के ऐड का उपयोग करें। – MrKiane

उत्तर

19

कि अगर आप एक ही प्रबंधन के कई व्यवस्थाएं की है हो सकता है बीन वर्ग जैसे जेएसएफ और सीडीआई, या जेएसएफ और वसंत, या सीडीआई और वसंत, आदि बीन पर अपनी कॉन्फ़िगरेशन और एनोटेशन को दोबारा जांचें।

यदि आप सीडीआई का उपयोग कर रहे हैं और कक्षा में कई @Named एनोटेशन का उपयोग कर रहे हैं तो यह भी हो सकता है। उदाहरण के लिए, एक @Named सीधे कक्षा में इसे एक प्रबंधित बीन के रूप में पंजीकृत करने के लिए और @Produces गेटर विधि पर एक और पंजीकृत करने के लिए। आपको खुद से पूछना होगा कि वास्तव में आवश्यक है। आप #{someObject} के बजाय #{bean.someObject} का भी उपयोग कर सकते हैं।

@Named 
@RequestScoped 
public class Bean { 

    @PostConstruct 
    public void init() { 
     // ... 
    } 

    @Named 
    @Produces 
    public SomeObject getSomeObject() { 
     // ... 
    } 

} 

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

public abstract class BaseBean { 

    @PostConstruct 
    public void postConstruct() { 
     init(); 
    } 

    public abstract void init(); 

} 
+1

धन्यवाद! मेरे पास कई ढांचे नहीं हैं लेकिन इससे मुझे यह समझने में मदद मिली कि समस्या क्या थी। मेरे सभी प्रबंधित बीन्स 'बेसकंट्रोलर' का विस्तार करते हैं। इस बेसकंट्रोलर में '@ पोस्टकॉन्स्ट्रक्ट इनिट()' विधि है जिसे मैंने सोचा था कि यह अन्य प्रबंधित बीन्स 'पोस्टकॉन्स्ट्रक्ट इनिट() 'द्वारा ओवरराइड किया जाएगा। ऐसा लगता है कि दोनों 'init() 'कहा जाता है। यह सब अब समझ में आता है .. धन्यवाद! – Ionut

+0

आपको 'बेसकंट्रोलर' कक्षा में '@ पोस्ट कॉन्स्ट्रक्ट' नहीं होना चाहिए। इसे हटा दो। – BalusC

+0

@ बालससी: मेरे पास एक छोटा सा सवाल है। एक ही बीन पर जेएसएफ और सीडीआई का उपयोग करने के संबंध में, यदि मैं '@ इंजेक्ट 'का उपयोग करता हूं तो एक' @ प्रबंधित 'में एक सीडीआई बीन इंजेक्ट करने के लिए, क्या @ @ पोस्टकोनस्ट्रक्चर विधि को दो बार बुलाया जाएगा? मुझे पूरा यकीन नहीं है कि एक ही बीन पर एकाधिक ढांचे को कैसे लागू किया जाए। मैंने सोचा था कि फ्रेमवर्क का निर्णय '@ प्रबंधित बीन', 'नामित', आदि के साथ बीन को एनोटेट किया गया था। –

3

यह संभव है कि दोनों init() विधि और @PostConstruct तरीकों सक्रिय हो रहे हैं और इस व्यवहार का कारण है। init() विधि और/या इसे private डालने का नाम बदलने का प्रयास करें। मुझे लगता है कि यह अपनी समस्याओं से संबंधित हो सकता:

http://javahowto.blogspot.com/2011/07/servlet-init-method-vs-postconstruct.html

मैं भी यहाँ JSF जीवन चक्र डिबगिंग के बारे में एक अच्छा पोस्ट पाया: Debug JSF lifecycle

+1

इसका कोई मतलब नहीं है। एक जेएसएफ प्रबंधित बीन 'HttpServlet' कार्यान्वयन नहीं है। – BalusC

+0

मेरा मतलब था कि कॉन्फ़िगरेशन के आधार पर यह प्रणाली को दोनों तरीकों से भ्रमित और आग लग सकती है। शायद यह एक लंबा शॉट था हालांकि। अपना स्पष्टीकरण के लिए धन्यवाद। – MrKiane

+0

मैंने एनोटेशन को हटाने का प्रयास किया लेकिन फिर init() को अनदेखा कर दिया जाएगा। चूंकि बलुस ने कहा कि ऐसा लगता है कि एक प्रबंधित बीन में कोई init() विधि नहीं है। – Ionut

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