سؤال

حسنًا، لقد مررت بأول StackOverflowError منذ انضمامي إلى هذا الموقع، واعتقدت أن هذا أمر لا بد منه :-).البيئة الخاصة بي هي Seam 2.0.1.GA وJBoss 4.2.2.GA وأنا أستخدم JSF.أنا بصدد التحويل من عرض الواجهات إلى JSP للاستفادة من بعض علامات JSP الموجودة المستخدمة في موقعنا الحالي.لقد قمت بتغيير ملفي التكوين faces-config.xml وweb.xml وبدأت أتلقى الخطأ التالي عند محاولة عرض صفحة jsp.أي شخص لديه أي أفكار؟

2008-09-17 09:45:17,537 التصحيح [org.jboss.seam.contexts.FacesLifecycle] بدء طلب JSF ل / form_home.jsp 2008-09-17 09:45:17,587 خطأ [org.apache.catalina.core.ContainerBase. [jboss.web]. [المضيف المحلي]. [/]. [وجوه Servlet]] Servlet.service() for سيرفلت وجوه سيرفلت ألقى استثناء java.lang.StackOverflowError في org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:210) في org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:222) في org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:222) في org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:222) ...

ملف faces-config.xml الخاص بي أصبح الآن فارغًا بدون FaceletsViewHandler:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 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-facesconfig_1_2.xsd">

</faces-config>

وملف Web.xml الخاص بي:

<?xml version="1.0"?>
<web-app version="2.5" 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_2_5.xsd">
 <!-- Ajax4jsf -->
 <context-param>
  <param-name>org.richfaces.SKIN</param-name>
  <param-value>blueSky</param-value>
 </context-param>
  <!-- Seam -->
 <listener>
  <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
 </listener>


 <filter>
  <filter-name>Seam Filter</filter-name>
  <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
 </filter>

 <filter-mapping>
  <filter-name>Seam Filter</filter-name>
  <url-pattern>*.jsp</url-pattern>
 </filter-mapping>

 <servlet>
    <servlet-name>Seam Resource Servlet</servlet-name>
     <servlet-class>org.jboss.seam.servlet.SeamResourceServlet
     </servlet-class>
 </servlet>
 <servlet-mapping>
   <servlet-name>Seam Resource Servlet</servlet-name>
   <url-pattern>/seam/resource/*</url-pattern>
 </servlet-mapping>
 <!-- Seam end --> 

 <!-- JSF -->
 <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.jsp</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>*.jsp</url-pattern> 
 </servlet-mapping>
هل كانت مفيدة؟

المحلول

لقد تمكنت من معرفة هذه المشكلة.من الواضح أنه لا يمكنك تكوين web.xml ليكون له نفس القيمة المعلمية لـ .jsp لـ Javax.faces.DEFAULT_SUFFIX مثل نمط عنوان url الخاص بـ Faces Servlet (*.jsp).إذا قمت بتغيير نمط عنوان url الخاص بك إلى .jspx أو إلى /whateverdirnameyouwant/ يبدأ التطبيق دون وجود أخطاء في تجاوز سعة المكدس.(ملحوظة:المفتاح هو أن DEFAULT_SUFFIX وfaces servlet url-pattern لا يمكن أن يكونا متماثلين بغض النظر عن ماهيتهما.) آمل أن يساعد هذا أي شخص آخر يواجه هذه المشكلة المحددة.

نصائح أخرى

غالبًا ما يكون سبب تجاوزات المكدس في Java هو استدعاءات التكرار/الأسلوب اللانهائية.في حالتك نظرًا لتتبع المكدس، يبدو أنه يتم استدعاء 'getAttribute()' بشكل متكرر حتى التعطل.على الرغم من أنني لست على دراية بالبيئات المحددة التي تستخدمها، إلا أنني أقترح التحقق من كود .jsp الخاص بك بحثًا عن أي من هذا النوع من السلوك (على سبيل المثال طريقتان تتصلان ببعضهما البعض)

لذا، كان لدي خطأ مماثل.بالنسبة لي، كان لدي مشروع JSF وكنت أعبث بامتدادات الملفات.في البداية، كانت لدي جميع ملفات الويب ذات الامتداد .jsp.كان هذا ناجحًا، ولكن بعد ذلك أردت أن تكون كلها بتنسيق .jsf، ثم بعد ذلك بدأت في استخدام .xhtml.في هذه العملية، تم تغيير ملف web.xml الخاص بي ليستوعب xhtml وjsf.كان تغيير ملف web.xml أمرًا جيدًا.ما جعلني أعاني من StackOverflowError هو أن لدي ملف Index.xhtml مع علامة ui.include التي تشير إلى header.jsf.لذلك كان لدي ملف xhtml يشير إلى ملف jsf.لقد اعتقدت أن web.xml سيكون قادرًا على التعامل مع هذا الأمر، لكنه لم يفعل، لقد حصلت على StackOverflowError.لذا، لإصلاح هذه المشكلة، أصبحت جميع ملفات JSF الخاصة بي تحتوي على الامتداد .xhtml، وتشير علامات ui:include المتداخلة إلى ملفات .xhtml.

على الجانب الآخر، يمكن لعنوان url الخاص بالمتصفح التعامل مع ملفات Index.jsp وindex.jsf وindex.xhtml بشكل جيد.لذا فإن web.xml (مع تعيينات servlet لـ jsp وjsf وxhtml) يتعامل مع عنوان URL للمتصفح بشكل جيد، ولكن ليس لما أبرزته مشكلتي أعلاه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top