2012-06-08 14 views
7

मैं अपने आवेदन स्टार्टअप पृष्ठ लोड पर निम्न त्रुटि हो रही है:सत्र नहीं बना सकते बाद प्रतिक्रिया किया गया है

SEVERE: Error Rendering View[/HomeTemplate/equityVolume.xhtml] 
javax.el.ELException: /HomeTemplate/equityVolume.xhtml @70,78 value="#{equityBean.scripList}": java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed... 

    Caused by: java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed... 

मैं इस त्रुटि मिलती है जब मैं अपने मुखपृष्ठ पर सीएसएस लागू, त्रुटि गायब हो जब मैं हटाने

: सीएसएस टेम्पलेट (लेकिन मैं सीएसएस टेम्पलेट aplly करना चाहते हैं) निम्नलिखित सेम कोड स्निपेट कि (डिबगिंग द्वारा पाया)

public List<MasterScrip> getScripList() { 
    HttpServletRequest req=(HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); //error line 
    HttpSession session=req.getSession(); 
    type=(String)session.getAttribute("type");... 

एक्सएचटीएमएल कोड त्रुटि का कारण बनता है 210

<h:body> 
    <ui:composition template="commonClientLayout.xhtml"> 

    <ui:define name="contentFile"> 
      <div id="content"> 
    <h:form id="frm">... 

जब मैं ui को हटाता हूं: संयोजन और टैग परिभाषित करता हूं (यानी। अगर मैं सीएसएस लागू नहीं करता), तो मुझे यह त्रुटि नहीं मिलती है। इस त्रुटि का कारण क्या हो सकता है और मैं इसे कैसे हल करूं?

संपादित:

@PostConstruct 
void initialiseSession() { 
    if(type!=null) 
     { 
     if(type.equalsIgnoreCase("losers")) 
     { 
     scripList=new ArrayList<MasterScrip>(); 
     scripList=getScripByPriceLosers(exchange); 
     // return scripList; 
     } 
     else if(type.equalsIgnoreCase("gainers")) 
     { 
     scripList=new ArrayList<MasterScrip>(); 
    scripList=getScripByPriceGainers(exchange); 
     // return scripList; 
     } 
     else 
     { 
      scripList=new ArrayList<MasterScrip>(); 
    scripList=getScripByVolumeType(exchange); 
    // return scripList; 
     } 
     } 
     else 
     { 
      scripList=new ArrayList<MasterScrip>(); 
    scripList=getScripByVolumeType(exchange); 
     } 

} 

    public List<MasterScrip> getScripList() { 
     return scripList; 

    } 

फिर से संपादित:

SEVERE: Error Rendering View[/equityVolume.xhtml] 
java.lang.IllegalStateException 
    at org.apache.catalina.connector.ResponseFacade.setBufferSize(ResponseFacade.java:275)... 

संपादित करें: web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Production</param-value> 
    </context-param> 
    <context-param> 
     <param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name> 
     <param-value>65535</param-value> 
    </context-param> 

    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 

    </session-config> 
    <welcome-file-list> 
     <welcome-file>equityVolume.xhtml</welcome-file> 
    </welcome-file-list> 
    <security-constraint> 
     <display-name>Constraint1</display-name> 
     <web-resource-collection> 
      <web-resource-name>AdminTemplate</web-resource-name> 
      <description/> 
      <url-pattern>/AdminTemplate/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>admin</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <security-constraint> 
     <display-name>Constraint2</display-name> 
     <web-resource-collection> 
      <web-resource-name>ClientTemplate</web-resource-name> 
      <description/> 
      <url-pattern>/ClientTemplate/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>client</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <login-config> 
     <auth-method>FORM</auth-method> 
     <realm-name>DataRealm</realm-name> 
     <form-login-config> 
      <form-login-page>/equityVolume.xhtml</form-login-page> 
      <form-error-page>/errorpage.xhtml</form-error-page> 
     </form-login-config> 
    </login-config> 
    <security-role> 
     <description/> 
     <role-name>admin</role-name> 
    </security-role> 
    <security-role> 
     <description/> 
     <role-name>client</role-name> 
    </security-role> 
</web-app> 

उत्तर

6

आपको गेटर्स में व्यवसाय नौकरी नहीं करनी चाहिए। इसे इसके बजाय बीन (पोस्ट) कन्स्ट्रक्टर में करें।

आपकी ठोस समस्या इसलिए होती है क्योंकि आप एक नए नए ब्राउज़र सत्र पर अपेक्षाकृत बड़े पृष्ठ का अनुरोध कर रहे हैं जिसके लिए सर्वर HttpSession अभी तक नहीं बनाया गया है और ईएल अभिव्यक्ति #{equityBean.scripList} पृष्ठ में अपेक्षाकृत देर से संदर्भित है।

प्रतिक्रिया बफर डिफ़ॉल्ट 2KB के द्वारा होता है और जब यह एक बड़ी प्रतिक्रिया की वजह से overflows, तो यह प्रतिबद्ध होना होगा। इसका मतलब है कि सभी प्रतिक्रिया शीर्षलेख भेजे जाएंगे और HTML आउटपुट का पहला ~ 2 केबी भेजा जाएगा। फिर, उस बिंदु के बाद, ईएल अभिव्यक्ति #{equityBean.scripList} हल हो जाएगी जहां आप सत्र प्राप्त करने का प्रयास कर रहे हैं। यदि सर्वर HttpSession अभी तक उस पल में नहीं बनाया गया है, तो सर्वर को की आवश्यकता है ताकि इसे बाद में अनुरोधों के लिए बनाए रखने के लिए प्रतिक्रिया शीर्षलेख में कुकी सेट की जा सके। लेकिन अगर यह प्रतिक्रिया पहले ही हो चुकी है तो यह संभव नहीं है। इसलिए यह अपवाद।

जैसा कि कहा गया है, बस इसके बजाय बीन (पोस्ट) कन्स्ट्रक्टर में नौकरी करें। या बस इसे प्रबंधित संपत्ति के रूप में इंजेक्ट करें।

@ManagedProperty("#{type}") 
private String type; 

अपवाद अभी भी होती है, तो आप शायद जो मुद्दों 2215 और 2277 जो "अनावश्यक" सत्र की भी चरम स्थगित के कारण होता है में वर्णित के रूप बग से ग्रस्त है Mojarra के एक पुराने संस्करण का उपयोग कर रहे सृष्टि। यह मोजररा 2.1.8 के बाद से तय किया गया है। इसलिए, इसे अपग्रेड करना या नया (वर्तमान में 2.1.9) इसे करना चाहिए।


असंबंधित ठोस समस्या के लिए, getScripList() तर्क रास्ता बदबूदार कर रहा है। लेकिन यह एक अलग समस्या/प्रश्न के लिए विषय है। क्या आप जानते हैं कि आप ईएल में #{type} के रूप में नाम "प्रकार" के साथ सत्र विशेषता तक पहुंच सकते हैं? क्या आप जानते हैं कि जेएसएफ बैकिंग बीन क्लास में कच्चे javax.servlet.* आयात से अधिक बार संकेत मिलता है कि आप संभवतः गलत तरीके से काम कर रहे हैं और कंक्रीट कार्यात्मक आवश्यकता को प्राप्त करने के लिए और अधिक "जेएसएफ-ईश" तरीके हो सकते हैं?

+0

स्पष्टीकरण के लिए धन्यवाद। मैंने पोस्ट कॉन्स्ट्रक्चर विधि में व्यवसाय तर्क सेट किया है, फिर भी मुझे एक ही त्रुटि मिलती है (संपादित प्रश्न देखें)। मैं अपने ऐप में और कुछ नहीं प्राप्त कर सकता, मुझे क्या करना चाहिए? :( – z22

+0

तो बीन को पृष्ठ में पहले कहीं भी संदर्भित नहीं किया गया है? आप किस जेएसएफ इंप/संस्करण का उपयोग कर रहे हैं? इसी तरह की समस्या मोजररा 2.1.8 में तय की गई थी। वैकल्पिक रूप से आप डिफ़ॉल्ट प्रतिक्रिया बफर आकार को बदल सकते हैं और बढ़ा सकते हैं। – BalusC

+0

हां इसे पहले xhtml पृष्ठ – z22

3

मुझे यह वेब ढांचा नहीं पता है (क्या यह जेएसएफ है?) लेकिन यहां क्या होता है। आपका एक्सएचटीएमएल आउटपुट को प्रस्तुत करना शुरू करता है और कुछ पात्र ब्राउज़र पर पहले से ही भेजे जा चुके हैं। इसका तात्पर्य है कि पूरा हेडर भी भेजा गया था।

कहीं अपने टेम्पलेट के बीच में बुला रहे हैं #{equityBean.scripList} (btw टाइपो) जिसमें कॉल बदल जाता है:

HttpSession session=req.getSession(); 

इस विधि HTTP सत्र पैदा करेगा अगर एक मौजूद नहीं है। बाद के अनुरोधों पर सत्र की पहचान करने के लिए सत्र आईडी को क्लाइंट को प्रतिक्रिया (कुकी या यूआरएल रीराइटिंग का उपयोग करके) के साथ भेजा जाना चाहिए। हालांकि चूंकि प्रतिक्रिया शीर्षलेख पहले से ही भेजे गए थे, इसलिए सर्वलेट कंटेनर सत्र आईडी को वापस भेजने में सक्षम नहीं है - और यहां तक ​​कि बड़ी समस्याओं से बचने के लिए एक अपवाद फेंकता है।

आप इसे कैसे हल कर सकते हैं? ऐसा लगता है कि आप पहली बार पेज को प्रतिपादित कर रहे हैं जब अनुरोध से बिल्कुल कोई सत्र नहीं है। आप सत्र बनाने से बच सकते हैं:

HttpSession session=req.getSession(false); //false here! 
if(session != null) { 
    type=(String)session.getAttribute("type"); 
} 
//handle the case when session or type attribute weren't there 

एक और तरीका है कि आप दृश्य को नियंत्रित करने से पहले सत्र को सक्रिय रूप से तैयार करें। हालांकि आपको के लिए अभी भी type विशेषता की जांच करनी है।

+0

ने कोशिश की, फिर भी मुझे त्रुटि मिलती है ... मैं css लागू नहीं कर सकता :( – z22

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

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