好吧,自从加入这个网站以来,我遇到了我的第一个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] 开始对/form_home.jsp的JSF请求 2008-09-17 09:45:17,587错误 [org.apache.catalina.core.ContainerBase [jboss.web]。[本地主机]。[/]。[面孔 Servlet]] Servlet.service()for servlet Faces Servlet引发了异常 java.lang.StackOverflowError的 在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>
答案 0 :(得分:9)
我能够弄清楚这个问题。显然,您无法将web.xml配置为具有与Javax.faces.DEFAULT_SUFFIX相同的.jsp的param值作为Faces Servlet url-pattern(* .jsp)。如果您将url-pattern更改为 .jspx或更改为/ whateverdirnameyouwant / ,则应用程序启动时不会出现堆栈溢出错误。 (注意:关键是DEFAULT_SUFFIX和Faces Servlet url-pattern无论它们是什么都不能相同。)希望这可以帮助其他遇到这个特定问题的人。
答案 1 :(得分:2)
java中的堆栈溢出几乎总是由无限递归/方法调用引起的。在给定堆栈跟踪的情况下,似乎重复调用'getAttribute()'直到崩溃。虽然我并不熟悉您正在使用的特定环境,但我建议您检查.jsp代码以查找任何此类行为(例如,两种相互调用的方法)
答案 2 :(得分:0)
所以,我有类似的错误。对我来说,我有一个JSF项目,我正在搞乱文件扩展名。首先,我的所有web文件都扩展名为.jsp。这是有效的,但后来我希望它们都是.jsf,之后我全力以赴使用.xhtml。在此过程中,我的web.xml文件已更改为容纳xhtml和jsf。更改web.xml文件很好。是什么让我得到了StackOverflowError,因为我有一个带有指向header.jsf的ui.include标记的index.xhtml。所以我有一个指向jsf文件的xhtml文件。我曾经以为web.xml能够处理这个问题,但事实并非如此,我得到了StackOverflowError。所以,为了解决这个问题,现在我的所有JSF文件都扩展名为.xhtml,嵌套的ui:include标签指向.xhtml文件。
另一方面,浏览器url可以处理index.jsp,index.jsf,index.xhtml就好了。所以web.xml(使用jsp,jsf和xhtml的servlet映射)处理浏览器url就好了,但不是我上面突出显示的问题。