2011-11-09 6 views
46

मैं एक बहुत ही सरल JSF 2 पेज में निम्न अपवाद का सामना करना पड़ रहा हूँ <h:form> जोड़ने के बाद:<h:form> जोड़ना java.lang.IllegalStateException कारण बनता है: एक सत्र नहीं बनाई जा सकती बाद प्रतिक्रिया के लिए प्रतिबद्ध किया गया है

java.lang.IllegalStateException: Cannot create a session after the response has been committed 
    at org.apache.catalina.connector.Request.doGetSession(Request.java:2758) 
    at org.apache.catalina.connector.Request.getSession(Request.java:2268) 

मैं Mojarra 2.1.3 और PrimeFaces3.0M4, का उपयोग कर बिलाव 7.0.22 और JDK 7.

पेज एक बहुत ही बुनियादी डेटा तालिका है पर:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 

</h:head> 
<h:body> 
    <h:form>   
     <p:dataTable var="car" value="#{tableBean.cars}"> 

       ...... 
     </p:dataTable> 
    </h:form> 
</h:body> 
</html> 

पेज से पता चलता है ब्राउज़र पर सही ढंग से, लेकिन कंसोल पर मुझे अपवाद दिखाई देता है। अगर मैं <h:form> हटा देता हूं तो अपवाद गायब हो जाता है।

यह कैसे होता है और मैं इसे कैसे हल कर सकता हूं?

उत्तर

82

यह एक ज्ञात समस्या है और आपके द्वारा वास्तव में issue 2215 के रूप में रिपोर्ट किया गया है। यह तब होगा जब प्रतिक्रिया बफर ओवरफ़्लो हो गया है (बड़ी सामग्री के कारण) और सत्र बनाया जाने से पहले प्रतिक्रिया दी गई है। यह मोजररा के "अनावश्यक" सत्र निर्माण को जितना संभव हो सके स्थगित करने के लिए थोड़ा अति उत्साही प्रयासों का परिणाम है (हालांकि यह स्वयं की अच्छी बात है)।

जब तक वे यह तय करने के लिए, वहाँ कई संभावित हल कर रहे हैं:

  1. एक Filter जो FilterChain#doFilter() से पहले HttpServletRequest#getSession() करता है बनाएँ। लाभ: जेएसएफ कॉन्फ़िगरेशन/कोड बदलने की कोई ज़रूरत नहीं है। नुकसान: जब आप अनावश्यक सत्र से बचना चाहते हैं तो खुद को भी सृजन करना।

  2. कॉल में फली की (पोस्ट) निर्माता या preRenderView श्रोता में true साथ ExternalContext#getSession()। लाभ: वास्तव में, कुछ भी नहीं। नुकसान: बहुत हैकी।

  3. com.sun.faces.writeStateAtFormEnd के नाम और false के web.xml के साथ संदर्भ पैरामीटर जोड़ें। लाभ: # 1 और # 2 के विपरीत अनावश्यक सत्र निर्माण वास्तव में टाला जाएगा। नुकसान: प्रतिक्रिया अब </h:form> तक पहुंचने तक स्मृति में पूरी तरह से बफर हो जाएगी। यदि आपके फॉर्म बहुत बड़े नहीं हैं, तो प्रभाव कम होना चाहिए। हालांकि यह अभी भी विफल होगा यदि आपके <h:form> दृश्य में अपेक्षाकृत देर से शुरू होता है। इसे # 4 के साथ जोड़ा जा सकता है।

  4. javax.faces.FACELETS_BUFFER_SIZE के नाम के साथ एक संदर्भ पैरामीटर और एक (जैसे 64KB के लिए 65535) बाइट में Facelets प्रतिक्रिया बफर आकार का मान जोड़ें, ताकि पूरे HTML आउटपुट या कम से कम <h:form> (देखें # 3) के जवाब में फिट बैठता है बफर। लाभ/हानि, # 3 देखें।

  5. javax.faces.STATE_SAVING_METHOD के नाम और client से web.xml के साथ संदर्भ पैरामीटर जोड़ें। लाभ: सत्र तब तक नहीं बनाया जाएगा जब तक कि आपके पास सत्र स्कोप्ड बीन्स न हो। यह तुरंत संभावित ViewExpiredException मामलों को हल करता है। नुकसान: नेटवर्क बैंडविड्थ उपयोग में वृद्धि हुई। यदि आप आंशिक राज्य की बचत का उपयोग कर रहे हैं, तो प्रभाव कम से कम होना चाहिए।

क्यों समस्या गायब हो जाता है जब आप <h:form> दूर करने के लिए के रूप में, इस वजह से कोई सत्र को देखने के राज्य स्टोर करने के लिए में बनाया जाना चाहिए।


अद्यतन: यह है के अनुसार डुप्लीकेट issue 2277 Mojarra 2.1.8 के बाद से निर्धारित किया गया। तो, आप कम से कम उस संस्करण में अपग्रेड भी कर सकते हैं।

+1

धन्यवाद! ऐसा लगता है कि इस मुद्दे को मोजाररा 2.1.8 (http://java.net/jira/browse/JAVASERVERFACES-2277) के साथ हल किया जाएगा जिसे जल्द ही जारी किया जाना चाहिए – wemu

+1

पूरे जिरा के माध्यम से पढ़ें ऐसा लगता है कि समस्या अभी भी आसपास है , 2.1.16 –

+0

मुझे एक समान समस्या थी, और जब मैं 2.1.13 का उपयोग कर रहा हूं, तो समस्या आसपास थी। हालांकि, # 3 सलाह को लागू करने से इसे हल किया गया। –

5

javax.faces के कल जारी किए गए नए संस्करण 2.1.21 के साथ यह समस्या गायब हो गई प्रतीत होती है। नए संस्करण घोषित:

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.faces</artifactId> 
    <version>2.1.21</version> 
</dependency> 

और नए संस्करण 2.1.21 के लिए javax.faces.jar जगह glassfish मॉड्यूल फ़ोल्डर में javax.faces.jar बदलें।

-1

यदि आप स्प्रिंग एमवीसी का उपयोग कर रहे हैं और कॉल स्प्रिंग फॉर्म द्वारा बनाई गई है तो हमें POST (डेटा लाने के लिए) के बजाय जीईटी विधि का उपयोग करना चाहिए और कोई इनपुट फ़ील्ड नहीं होना चाहिए जिसे हम इंटीड का उपयोग कर सकते हैं।

+0

\t \t \t \t \t \t View All Hospitals \t \t \t \t \t – user2645432

2

मेरे मामले में (myfaces-2.2.8 & टोमकैट 8.0.23) समस्या के welcome-file में एक टाइपो थी। जब मैंने डीबगिंग देखा, तो टॉमकैट ने 404 की उम्मीद के रूप में बनाया, लेकिन किसी भी तरह से माइफेस ने बाद में सत्र तक पहुंचने की कोशिश की, जिसके बाद java.lang.IllegalStateException: Cannot create a session after the response has been committed हुआ। welcome-file में web.xml में एक वैध पृष्ठ का उपयोग करने के लिए मेरे लिए समस्या तय की गई।

0

आप JSF टैग

<html xmlns:f="http://java.sun.com/jsf/core"> 
इस काम करने के लिए

के लिए पहले और h:form तत्वों के बाद एक <f:view> और </f:view> जोड़ने, प्लस आप के लिए लिंक जोड़ने के लिए HTML टैग पड़ सकता है।

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

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