2011-04-04 13 views
24

यह सही प्रतीत नहीं होता है। मैं अपने कोड का कुछ सफाई कर रहा था और मैंने अभी यह देखा है। प्रत्येक AJAX अनुरोध मेरे @ViewScoped बीन के निर्माता और @PostConstruct को फायर कर रहा है। यहां तक ​​कि एक साधारण डेटाबेस पेजिनेशन इसे फायरिंग कर रहा है।@ViewScoped कॉल प्रत्येक पोस्टबैक अनुरोध पर @PostConstruct

I understood@ViewScoped@RequestScoped से अधिक लंबा है और इसे प्रत्येक अनुरोध पर पुनर्निर्मित नहीं किया जाना चाहिए। जीईटी द्वारा एक पूर्ण पृष्ठ रीलोड के बाद ही।

उत्तर

43

दूसरे शब्दों में, @ViewScoped बीन @RequestScoped बीन की तरह व्यवहार करता है। इसे प्रत्येक पोस्टबैक अनुरोध पर खरोंच से बनाया गया है। इसके लिए कई संभावित कारण हैं, जिनमें से अधिकांश उबालते हैं कि संबंधित जेएसएफ व्यू जेएसएफ राज्य में अब उपलब्ध नहीं है जो बदले में डिफ़ॉल्ट रूप से HTTP सत्र से जुड़ा हुआ है।

प्रदान किया गया है कि आप यह सुनिश्चित कर सकते हैं कि HTTP सत्र स्वयं समस्या का मूल कारण नहीं है, यानी @SessionScoped बिल्कुल ठीक काम करता है, फिर संभावित कारणों की नीचे दी गई सूची के माध्यम से चलें। अन्यथा, यदि HTTP सत्र स्वयं भी एक ही अनुरोध पर ट्रैश किया गया है और फिर से बनाया गया है, तो आपको एक कदम वापस लेने और सत्र कुकी और सर्वर कॉन्फ़िगरेशन देखने की आवश्यकता है। एक टूटी हुई HTTP सत्र से संबंधित कोई भी कारण कम से कम जेएसएफ के संदर्भ से परे है।

  1. आप Mojarra 2.1.17 या उससे अधिक का उपयोग कर रहे हैं, और दृश्य ईएल भाव जो बाँध एक दृश्य के एक टैग विशेषता जो view build time दौरान मूल्यांकन किया जाता है करने के लिए सेम संपत्ति scoped शामिल हैं। उदाहरण हैं जेएसटीएल <c:if>, <c:forEach>, आदि या जेएसएफ <ui:include>, <x:someComponent id="#{...}", <x:someComponent binding="#{...}">, आदि। यह मोजाररा (issue 1492) में एक बग के कारण होता है। यह भी देखें Why does @PostConstruct callback fire every time even though bean is @ViewScoped? JSF

    यह पहले से ही मोजाररा संस्करण 2.1.18 में तय है। यदि आप एक नए संस्करण में अपग्रेड नहीं कर सकते, वैकल्पिक हल आंशिक राज्य के रूप में नीचे web.xml में बचत निष्क्रिय करने के लिए है, यह भी JSTL in JSF2 Facelets... makes sense?

    <context-param> 
        <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> 
        <param-value>false</param-value> 
    </context-param> 
    

    देखने या आप केवल JSF विचारों का एक विशिष्ट समूह को लक्षित करना चाहते हैं:

    <context-param> 
        <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name> 
        <param-value>/foo.xhtml;/bar.xhtml;/folder/baz.xhtml</param-value> 
    </context-param> 
    

    उल्लेख करने के लिए महत्वपूर्ण है कि जेएसएफ घटक के id या binding के मूल्य को बाध्यकारी एक दृश्य स्कॉप्ड बीन संपत्ति एक बुरा अभ्यास है। उनको वास्तव में अनुरोधित बीन संपत्ति के अनुरोध के लिए बाध्य होना चाहिए, या एक विकल्प मांगा जाना चाहिए। भी How does the 'binding' attribute work in JSF? When and how should it be used?

  2. आप Mojarra 2.2.0 उपयोग कर रहे हैं, केवल उस संस्करण जो पहले से ही 2.2.1 में तय हो गई है दृश्य गुंजाइश बनाए रखने में एक (अभी तक अज्ञात) बग है, यह भी issue 2912 देखते हैं। समाधान एक नए संस्करण में अपग्रेड करना है।

  3. @ViewScoped एनोटेशन गलत पैकेज से आयात किया जाता है। जेएसएफ @ViewScoped एनोटेशन प्रदान करता है, javax.faces.bean पैकेज से जेएसएफ प्रबंधित बीन्स के लिए @ManagedBean के साथ एनोटेटेड, और javax.faces.view पैकेज से @Named के साथ एनडीएटेड सीडीआई प्रबंधित बीन्स के लिए पैकेज। जब बीन स्कोप एनोटेशन बीन प्रबंधन एनोटेशन से मेल नहीं खाता है, तो वास्तविक बीन स्कोप बीन प्रबंधन ढांचे के डिफ़ॉल्ट दायरे बन जाएगा, जो सीएसआई प्रबंधित बीन्स में जेएसएफ प्रबंधित बीन्स और @Dependent में @RequestScoped है।

    आपको यह सुनिश्चित करने की ज़रूरत है कि आपके पास निम्न में से कोई भी संरचना है और उन्हें मिश्रण न करें, @ViewScoped bean recreated on every postback request when using JSF 2.2 भी देखें।

    import javax.faces.bean.ManagedBean; 
    import javax.faces.bean.ViewScoped; 
    
    @ManagedBean 
    @ViewScoped 
    public class CorrectJSFViewScopedBean implements Serializable { 
    

    import javax.inject.Named; 
    import javax.faces.view.ViewScoped; 
    
    @Named 
    @ViewScoped 
    public class CorrectCDIViewScopedBean implements Serializable { 
    
  4. दृष्टिकोण है (गलती से?) क्षणिक <f:view transient="true"> के माध्यम से चिह्नित। यह मूल रूप से "स्टेटलेस जेएसएफ" चालू करता है, जो मोजररा 2.1.1 9 के बाद से नया है। इस प्रकार जेएसएफ व्यू बस जेएसएफ राज्य में सहेजा नहीं जाएगा और तार्किक परिणाम यह है कि सभी संदर्भित दृश्य स्कॉप्ड बीन्स जेएसएफ व्यू से जुड़े नहीं जा सकते हैं। देखें भी What is the usefulness of statelessness in JSF?

  5. वेब अनुप्रयोग एक गलत करने के लिए ViewExpiredException "से बचने" की कोशिश में true को com.sun.faces.enableRestoreView11Compatibility संदर्भ परम सेट के साथ कॉन्फ़िगर किया गया है। इस संदर्भ के साथ, ViewExpiredException कभी नहीं फेंक दिया जाएगा, लेकिन दृश्य (और सभी संबंधित दृश्य स्कैन बीन्स) को केवल स्क्रैच से पुनर्निर्मित किया जाएगा। हालांकि, अगर यह हर अनुरोध पर होता है, तो यह दृष्टिकोण वास्तव में एक और समस्या को छुपाता है: विचार बहुत जल्द समाप्त हो जाते हैं। यह जेएसएफ दृश्य राज्यों और/या HTTP सत्र को बनाए रखने में एक संभावित समस्या का संकेत देता है। इसे ठीक से कैसे हल/कॉन्फ़िगर करें, javax.faces.application.ViewExpiredException: View could not be restored पर जाएं।

  6. वेब एप्लिकेशन का रनटाइम क्लासपाथ कई अलग-अलग संस्करण वाले जेएसएफ एपीआई या इम्प्ले से संबंधित वर्गों के साथ प्रदूषित है। यह जेएसएफ दृश्य राज्य के लिए पहचानकर्ता/मार्करों में भ्रष्टाचार/विसंगति का कारण बनता है। आपको यह सुनिश्चित करने की ज़रूरत है कि आपके पास वेबएप के /WEB-INF/lib में एकाधिक जेएसएफ एपीआई जेएआर फाइलें नहीं हैं। यदि आप मेवेन का उपयोग कर रहे हैं, तो ध्यान से सुनिश्चित करें कि आप सर्वर-प्रदत्त पुस्तकालयों को <scope>provided</scope> के रूप में चिह्नित करते हैं। our JSF wiki page में "जेएसएफ इंस्टॉल करना" अनुभाग भी देखें और इस संबंधित प्रश्न का उत्तर: How to properly install and configure JSF libraries via Maven?

  7. आप PrimeFaces <p:dialog> उपयोग कर रहे हों, तो उस <p:dialog> अपनी ही <h:form> है सुनिश्चित करें और है कि यह एक और <h:form> में नेस्ट नहीं है। p:fileUpload inside p:dialog losing @ViewScoped values भी देखें।

  8. जब आप PrettyFaces साथ PrimeFaces FileUploadFilter मेल कर रहे हैं, तो सुनिश्चित करें कि FileUploadFilter भी PrettyFaces-पुनः/अग्रेषित अनुरोध पर चलता है बनाते हैं। ViewScoped bean rebuilt when FileUploadListener called using PrettyFaces और How to use PrimeFaces p:fileUpload? Listener method is never invoked or UploadedFile is null/throws an error/not usable भी देखें।

  9. आप PrettyFaces का उपयोग करते समय एक बुरी तरह से कॉन्फ़िगर किया गया पुनर्लेखन नियम जो एक @ViewScoped सेम से बंधा भी गुमराह व्यवहार दे देंगे एक JSF पृष्ठ पर सीएसएस/जे एस/छवि संसाधन पुनर्निर्देश। CDI ViewScope & PrettyFaces: Multiple calls to @PostConstruct (JSF 2.2) भी देखें।

+0

आपका सही। मैंने वेबसाइट पर एक फ़ंक्शन जोड़ा जो सी का उपयोग करता है: मेरे पृष्ठ पर foreach। कोई आश्चर्य नहीं कि मैंने इसे पहले नहीं देखा था। समस्या ui है: दोहराना मेरे मामले में काम नहीं करेगा। http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&t=59 आंशिक राज्य बचत सी के साथ काम करेगा: प्रत्येक के लिए? –

+0

दुर्भाग्य से नहीं, आंशिक राज्य की बचत को अक्षम करने से जेएसटीएल टैग के साथ समस्या हल नहीं होती है। हालांकि यह विशेष मामला मुश्किल है। सिद्धांत रूप में आप इसे एक पूर्णतया घटक के साथ हल कर सकते हैं, उदा। ' 'जो' 'के बजाय संग्रह स्वीकार करता है। मेरा मानना ​​है कि इसे कभी भी प्राइमफेस के फीचर अनुरोध के रूप में पोस्ट किया गया था, यह सुनिश्चित नहीं था कि कैगेटे ने इसके साथ क्या किया था। – BalusC

+1

PARTIAL_STATE_SAVING ने अपना जीवन बदल दिया –

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