Faces Servlet выбрасывает исключение java.lang.StackOverflowError

Хорошо, я столкнулся с моим первым StackOverflowError с момента присоединения к этому сайту, я подумал, что это обязательный пост:-). Моя среда - Seam 2.0.1.GA, JBoss 4.2.2.GA, и я использую JSF. Я в процессе преобразования из вида facelets в JSP, чтобы воспользоваться некоторыми существующими тегами JSP, используемыми на нашем существующем сайте. Я изменил файлы faces-config.xml и файла конфигурации web.xml и начал получать следующую ошибку при попытке отобразить страницу jsp. У кого-нибудь есть мысли?

2008-09-17 09: 45: 17 537 DEBUG [Org.jboss.seam.contexts.FacesLifecycle] Начать запрос JSF для /form _home.jsp 2008-09-17 09: 45: 17,587 ОШИБКА [org.apache.catalina.core.ContainerBase. [jboss.web]. [LocalHost]. [/]. [Лица Servlet]] Servlet.service() для Сервлет java.lang.StackOverflowError          at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:210)          at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:222)          at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:222)          at 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>

Ответы

Ответ 1

Мне удалось выяснить эту проблему. По-видимому, вы не можете настроить web.xml на то, чтобы иметь одинаковое значение параметра .jsp для Javax.faces.DEFAULT_SUFFIX в качестве URL-адреса сервлетов Faces (*.jsp). Если вы измените свой url-шаблон на .jspx или на/whateverdirnameyouant/приложение запустится без ошибок. (обратите внимание: ключ заключается в том, что DEFAULT_SUFFIX и Faces Servlet url-шаблон не могут быть одинаковыми независимо от того, что они есть.) Надеюсь, это поможет кому-то еще, кто испытывает эту конкретную проблему.

Ответ 2

Переполнение стека в java почти всегда вызвано бесконечными вызовами рекурсии/метода. В вашем случае, учитывая трассировку стека, появляется "getAttribute()", который вызывается повторно до сбоя. Хотя я не знаком с конкретной средой, которую вы используете, я бы предложил проверить ваш .jsp-код для любого из этих типов поведения (например, два метода, которые называют друг друга)

Ответ 3

Итак, у меня была аналогичная ошибка. Для меня было то, что у меня был проект 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(с отображением сервлетов для jsp, jsf и xhtml) обрабатывает URL-адрес браузера просто отлично, но не для того, что моя проблема выше выделена.