Faces Servlet引发异常java.lang.StackOverflowError
时间:2020-03-05 18:59:28 来源:igfitidea点击:
好的,自加入该网站以来,我遇到了我的第一个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] Begin JSF request for /form_home.jsp 2008-09-17 09:45:17,587 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/].[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception 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>
解决方案
回答
Java中的堆栈溢出几乎总是由无限递归/方法调用引起的。在给定堆栈跟踪的情况下,似乎反复调用'getAttribute()'直到崩溃。虽然我对我们所使用的特定环境不太熟悉,但我建议我们检查.jsp代码中是否存在任何此类行为(例如,两个相互调用的方法)
回答
我能够弄清楚这个问题。显然,对于Javax.faces.DEFAULT_SUFFIX,我们无法将web.xml配置为具有与Faces Servlet url模式(* .jsp)相同的.jsp参数值。如果将url-pattern更改为.jspx或者/ whateverdirnameyouwant /,则应用程序启动时不会出现堆栈溢出错误。 (注意:关键是DEFAULT_SUFFIX和Faces Servlet url-pattern不能相同,无论它们是什么。)希望这对遇到此特定问题的其他人有所帮助。