الاسبوع الماضي واجهت مشكلة في سيرفر احدى المواقع التي أقوم بتطوير مشروع باستخدام Java EE ،
المشكلة كانت غربيه حيث انها لا تظهر Not Reproducible على جهازي الشخصي ، وكانت المشكلة في الصفحة الرئيسية حيث
كنا نطور فيها باستمرار وكانت تعمل بلا مشاكل، ولكن بمجرد اضافة بعضاً من ال HTML/JSF Code على الصفحة اصبحت لا تعمل،
وكلما اقوم بحذفه تعمل الصفحة ، وبمجرد اضافته فلا تعمل الصفحة ويخرج هذا ال Exception:
Caused by: java.lang.IllegalStateException: PWC3999: Cannot create a session after the response has been committed at org.apache.catalina.connector.Request.doGetSession(Request.java:2880) at org.apache.catalina.connector.Request.getSession(Request.java:2577) at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:920) at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:155) at com.sun.faces.renderkit.ServerSideStateHelper.writeState(ServerSideStateHelper.java:175) at com.sun.faces.renderkit.ResponseStateManagerImpl.writeState(ResponseStateManagerImpl.java:122) at com.sun.faces.application.StateManagerImpl.writeState(StateManagerImpl.java:166) at com.sun.faces.application.view.WriteBehindStateWriter.flushToWriter(WriteBehindStateWriter.java:225) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:418) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) ... 27 more
طبعاً كانت تفكيري ينصب حول هذا الCode الجديد والذي هو عباره عن لنك لصفحات JSF تستخدم JSF Managed Bean وقمت باعاده كتابته اكثر من مرة ولا فائده ، بعد البحث على الانترنت وجدت أن هذه Bug موجودة في ال JSF Implementation المسمي ب Majorra ويجب التحديث للاصدارات الحديثة من بعد اصدار 2.1.8 والمشكلة بسبب أن حجم الصفحة اصبح كبير اكبر من 2K والسيرفر بشكل تلقائي يقوم بعمل flush للResponse اذا وصل لهذا الحد والمشكلة هنا أنه بسبب ان الصفحة لم تصل للنهايه وتمت كتابه الاجزاء الأولى فأن انشاء ال Session اصبح متأخراً حيث تم ارسال ال Response ولكن بدون الكوكيز (حيث انها يجب ان تكتب في ال Response Header )..
الحل هو بتحميل نسخه Majorra حديثة:
http://javaserverfaces.java.net/
ومن ثم بعد تحميل ملف ال jar قم بوضعه على السيرفر glassfish سواء كان السيرفر تم تنصيبه بشكل مستقل أو كان الذي يأتي مع الNetbeans (الجدير بالذكر ان الذي يأتي مع ال Netbeans في Glassfish 3.1.2 هو نسخه قديمة ايضاً Majorra 2.1.6 ويجب تحديثها اذا كنت تعمل على هذه النسخه من ال application server). عندما تنسخها ضعها على المسار /glassfish/modules وقم بجعل الاسم الملف javax.faces.jar بدون رقم الاصدارة واستبدله مع الملف الموجود هناك:
مصادر اخرى للخبير بلاس:
http://stackoverflow.com/questions/11877420/jsf-error-illegalstateexception-pwc3999-cannot-create-a-session-after-the-re
http://java.net/jira/browse/JAVASERVERFACES-2277
ارجوا ان تفيد التدوينه كل من واجه أو سيواجه هذه المشكلة فقد تحفظ عليك ساعات من شد الشعر 🙂
مشكور أخي وجدي يعطيك العافية 🙂
و لكن كيف لا تحدث هذه المشكله على جهازك؟ هل هي مشكلة فقط في نسخة 2.1.8 ؟ أعنى هل هي ليست موجودة على النسخ السابقه بما فيها النسخه التى في Netbeans ؟
المشكلة تحدث في جميع النسخه السابقة ل 2.1.8 سواء كانت في ال glassfish الذي يأتي مع ال Netbeans أو الذي تقوم بتحميله بشكل منفصل، لذلك وجب التحديث .. في جهازي اعمل على نسخه منفصلة glassfish 3.1.2.2 وقد تكون الMajorra بها احدث من نسخه 2.1.6 على العموم قمت بعمل التحديث ايضاً بها للضمان.. والآن اعمل على نسخه 2.1.9 ..
حالياً فحصت النسخه الجديد والان توجد نسخه 2.2.20 منها، فالتطوير يتم سريع فيه:
http://javaserverfaces.java.net/nonav/2.1/releasenotes.html
شكراً لكم،