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-адрес браузера просто отлично, но не для того, что моя проблема выше выделена.