在 Apache Tomcat 7.0.42 及更高版本上部署 Mojarra 2.1.x 和 2.2 会导致 java.lang.UnsupportedOperationException

Posted

技术标签:

【中文标题】在 Apache Tomcat 7.0.42 及更高版本上部署 Mojarra 2.1.x 和 2.2 会导致 java.lang.UnsupportedOperationException【英文标题】:Deploying Mojarra 2.1.x and 2.2 on Apache Tomcat 7.0.42 and above results in java.lang.UnsupportedOperationException 【发布时间】:2014-02-27 17:45:36 【问题描述】:

我们基于 java 7 se、JSF 2.1、使用 Mojarra 2.1.27 的 JSF Web 应用程序在 Apache Tomcat 7.0.41 及更低版本上运行良好。当我们尝试升级到 Tomcat 7.0.42 及更高版本时(我们已经尝试了直到 7.0.50 的所有版本),在应用程序启动后,在第一次点击 webapp 中的任何 URL 时,我们在 tomcat 中看到以下错误日志:

我已经调试过了,似乎异常的来源来自 defaultFacesContext 为空。

堆栈跟踪

INFO: Server startup in 1591 ms
Feb 03, 2014 6:32:25 PM org.apache.catalina.core.StandardContext fireRequestDestroyEvent
SEVERE: Exception sending request initialized lifecycle event to listener instance of class com.sun.faces.config.ConfigureListener
java.lang.UnsupportedOperationException
    at javax.faces.context.FacesContext.getExceptionHandler(FacesContext.java:287)
    at javax.faces.event.ExceptionQueuedEventContext.getListenersForEventClass(ExceptionQueuedEventContext.java:262)
    at com.sun.faces.application.ApplicationImpl.invokeComponentListenersFor(ApplicationImpl.java:2128)
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:289)
    at com.sun.faces.application.ApplicationImpl.publishEvent(ApplicationImpl.java:247)
    at com.sun.faces.application.WebappLifecycleListener.requestDestroyed(WebappLifecycleListener.java:125)
    at com.sun.faces.config.ConfigureListener.requestDestroyed(ConfigureListener.java:344)
    at org.apache.catalina.core.StandardContext.fireRequestDestroyEvent(StandardContext.java:6151)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:207)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

我已经用一个非常简单的应用程序重现了这个启动异常问题,该应用程序只有一个静态 JSF 页面,只有一个 Hello World,没有支持 bean,以及一个最小的 web.xml,如下所示。在 Tomcat 7.0.41 上一切正常,但在 Tomcat 7.0.42+ 上总是导致以下错误。

只是想知道是否有其他人遇到过这个问题?

<?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_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
version="3.0">
  <display-name>JSF TEST</display-name>
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>    
</web-app>

【问题讨论】:

【参考方案1】:

删除那个过时的监听器,然后放

<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>*.jsf</url-pattern>
</servlet-mapping>

【讨论】:

以上是关于在 Apache Tomcat 7.0.42 及更高版本上部署 Mojarra 2.1.x 和 2.2 会导致 java.lang.UnsupportedOperationException的主要内容,如果未能解决你的问题,请参考以下文章

Apache2.2 Tomcat7 集群 session共享 [windows]

24生产预警项目平台之Tomcat的支持log4j,日志输出为json格式

Tomcat 7.0.42 上的 403 访问被拒绝

Worklight 6.1,Tomcat 7.0.42 上的 SQL 适配器 (Oracle 11g) JNDI 错误

tomcat 7.0.42 pooling, hibernate 4.2, mysql 坚如磐石的自动重新连接解决方​​案

Linux系统下部署Tomcat