Skip to main content
 首页 » 编程设计

richfaces之tomcat 6.0 上的 JSF2 和 Richfaces 3.3.3 应用程序崩溃并出现 StackOverflowError

2024年01月31日19jirigala

我正在将 JSF 2 和 richfaces 3.3.3 用于托管在 tomcat 6.0.20 上的应用程序。 一旦通过浏览器(Mozilla 和 IE)发出请求,应用程序就会崩溃。

我的 web.xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
 id="WebApp_ID" version="2.5"> 
 
 <display-name>TestJSF</display-name> 
 
 <welcome-file-list> 
  <welcome-file>pages/login.xhtml</welcome-file> 
 </welcome-file-list> 
 
 <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>/faces/*</url-pattern> 
 </servlet-mapping> 
 <servlet-mapping> 
  <servlet-name>Faces Servlet</servlet-name> 
  <url-pattern>*.xhtml</url-pattern> 
 </servlet-mapping> 
 
 <context-param> 
  <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
  <param-value>server</param-value> 
 </context-param> 
 <context-param> 
  <param-name>javax.faces.DISABLE_FACELET_JSF_VIEWHANDLER</param-name> 
  <param-value>true</param-value> 
 </context-param> 
 <context-param> 
  <param-name>org.richfaces.SKIN</param-name> 
  <param-value>blueSky</param-value> 
 </context-param> 
 <context-param> 
  <param-name>org.richfaces.CONTROL_SKINNING</param-name> 
  <param-value>enable</param-value> 
 </context-param> 
 <context-param> 
  <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
  <param-value>.xhtml</param-value> 
 </context-param> 
 <context-param> 
  <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> 
  <param-value>true</param-value> 
 </context-param> 
 
 <listener> 
  <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
 </listener> 
 
 <filter> 
  <display-name>RichFaces Filter</display-name> 
  <filter-name>richfaces</filter-name> 
  <filter-class>org.ajax4jsf.Filter</filter-class> 
 </filter> 
 
 <filter-mapping> 
  <filter-name>richfaces</filter-name> 
  <servlet-name>Faces Servlet</servlet-name> 
  <dispatcher>REQUEST</dispatcher> 
  <dispatcher>FORWARD</dispatcher> 
  <dispatcher>INCLUDE</dispatcher> 
 </filter-mapping> 
 
</web-app> 

异常(exception)是

    javax.servlet.ServletException: Servlet execution threw an exception 
 org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:530) 
 com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:542) 
 com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:359) 
 com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:150) 
 com.sun.faces.application.view.JspViewHandlingStrategy.renderView(JspViewHandlingStrategy.java:190) 
 com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127) 
 org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100) 
 org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176) 
 com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117) 
 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
 com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135) 
 javax.faces.webapp.FacesServlet.service(FacesServlet.java:309) 

以此递归方式记录堆栈跟踪,直到发生 StackOverflowError。

如果我删除所有与 Richfaces 相关的配置,该应用程序就会像魅力一样工作。 非常感谢任何建议。

请您参考如下方法:

对于初学者,请更改此部分...

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 

faces servlet 应该映射到 .jsf,或者只是/faces/。然后禁用 JSF2 内置的 faces servlet...

<context-param> 
    <param-name>javax.faces.DISABLE_FACELET_JSF_VIEWHANDLER</param-name> 
    <param-value>true</param-value> 
</context-param> 

现在包括原始的facelets jar...它应该类似于版本 1.1.15 或其他版本。这里发生的事情是,JSF 1.x 没有专门的 View 技术,尽管大多数人使用 JSP,但它有一些严重的缺点。因此,facelets 作为专用 View 技术集成到 JSF2 中。问题是 RichFaces 3.x 尚未完全支持 JSF2,特别是它仍然依赖于独立的 Facelets 项目。因此,您必须禁用内置的facelets,并包含独立版本的facelets。或者,RichFaces4 刚刚与 Milestone 5 一起发布,它非常接近候选版本(然后是稳定版本),并且它应该与 JSF2 完全集成