【问题标题】:java.lang.StackOverflowError at javax.faces.context.FacesContext.getAttributes(FacesContext.java:64)java.lang.StackOverflowError 在 javax.faces.context.FacesContext.getAttributes(FacesContext.java:64)
【发布时间】:2014-07-15 04:04:14
【问题描述】:

当我点击应用程序 URL (http://localhost:9082/pages/upload.jsf) 时,浏览器上只显示“错误:500 StackOverflowError”。 根据我对这个问题的基础,我可以看到这可能是由于一些递归问题。

部署我的应用程序的服务器是 WAS 8

请有人帮我解决这个问题。我知道这很模糊,如果我需要分享任何内容,请告诉我。 (例如控制台上的错误消息和其他东西)

at javax.faces.context.FacesContext.getAttributes(FacesContext.java:64)
at javax.faces.context.FacesContext.getAttributes(FacesContext.java:64)
    [the same line repeated many times]
at javax.faces.context.FacesContext.getAttributes(FacesContext.java:64)
at javax.faces.context.FacesContext.getAttributes(FacesContext.java:64)
at org.apache.myfaces.application.ResourceHandlerImpl.isResourceRequest(ResourceHandlerImpl.java:416)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:180)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1188)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:763)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:454)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:125)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:92)
at com.lmig.putt.customComponents.UploadFilter.doFilter(UploadFilter.java:61)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:192)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:89)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:919)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1016)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3703)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:962)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:276)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture$1.run(AsyncChannelFuture.java:205)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659)

` 这是我在点击 URL 后在控制台上找到的错误消息。请帮助我,因为我发现它是全新的并且很难破解

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>PUTT</display-name>

 <context-param>
  <param-name>log4ConfigLocation</param-name>
  <param-value>/WEB-INF/classes/log4j.properties</param-value>
 </context-param>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/application-context.xml</param-value>
 </context-param>
  <!-- Log4jConfigListener also tries to
        set the webAppRootKey. solve this by adding the following statements in web.xml -->
 <context-param>
  <param-name>log4jExposeWebAppRoot</param-name>
  <param-value>false</param-value>
 </context-param>


 <listener>
  <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 </listener>
 <listener>
  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
 </listener>
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <listener>
  <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
 </listener>



    <jsp-config>
        <taglib>
            <taglib-uri>http://www.lmig.com/PUTT/upload</taglib-uri>
            <taglib-location>/WEB-INF/upload.tld</taglib-location>
        </taglib>
    </jsp-config>  
     <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>
    <filter>
     <filter-name>Upload Filter</filter-name>
     <filter-class>com.lmig.putt.customComponents.UploadFilter</filter-class>
     <init-param>
     <param-name>com.lmig.putt.customComponents.UploadFilter.sizeThreshold</param-name>
     <param-value>1024</param-value>
     </init-param>
     </filter>
    <filter-mapping>
        <filter-name>Upload Filter</filter-name>
        <url-pattern>/pages/upload.jsf</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>Upload Filter</filter-name>
        <url-pattern>/pages/upload.jsp</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>
        javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <resource-ref>
<description>DataSource</description>
<res-ref-name>jdbc/db2DS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

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

</web-app>

faces-config.xml

<?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 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-facesconfig_2_0.xsd"
        version="2.0">



    .

    .
    .
    .
</faces-config>

【问题讨论】:

  • 你需要添加代码而不仅仅是stacktrace
  • 是的,你在递归问题上可能是对的。给我们看一些代码...
  • 在确定堆栈溢出错误时,堆栈跟踪的重复部分正是最有趣的部分,它最有可能包含问题的整个答案,但您从问题中忽略了这一点。请重新添加,以便您的问题得到解答。
  • 没有。只是调用路径。为什么它会回到原来的位置。您还认为如何确定和理解它?
  • 好的,因此FacesContext.getAttributes(FacesContext.java:64) 每次都会一次又一次地调用自己。这很有帮助,谢谢。 @user1129329:请告知您的服务器使用的 MyFaces 版本,以便查阅正确的源代码文件。

标签: jsf websphere myfaces


【解决方案1】:

基于 MyFaces 2.0.5 源代码,堆栈跟踪中的行号匹配,FacesContext#getAttributes() 如下所示:

55    public Map<Object, Object> getAttributes()
56    {
57        FacesContext ctx = _firstInstance.get();
58        
59        if (ctx == null)
60        {
61            throw new UnsupportedOperationException();
62        }
63        
64        return ctx.getAttributes();
65    }

换句话说,_firstInstance.get() 在您的特定情况下错误地返回了当前实例。这表明在其他地方的代码中的某个点,JSF 内部代码中发生了以下操作:

FacesContext.setCurrentInstance(FacesContext.getCurrentInstance());

这是不对的。 FacesContext 的当前实例不应该引用它自己。它只会导致每次访问自身的无限循环,正如堆栈跟踪所证明的那样。

此外,您显然已使用 web.xml 中特定于 Mojarra 的侦听器成功部署 Web 应用程序这一事实

 <listener>
  <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
 </listener>

建议您在 webapp 的运行时类路径中有 MyFaces 的竞争对手 Mojarra。换句话说,您混合了两个完全不同的 JSF 实现!这绝对是不对的。这就像在一台汽车发动机中混合汽油和柴油。 IBM WebSphere 附带捆绑了 MyFaces。您应该删除任何与 Mojarra 相关的 JAR 文件(jsf-api.jar、jsf-impl.jar 和/或 javax.faces.jar)、配置条目 (com.sun.faces.*) 和您的 web 应用程序中的其他工件。它们与 MyFaces 冲突。

另见:

【讨论】:

    【解决方案2】:

    此错误可能是由于类加载问题。您很可能在 WAS 7.0 或更高版本中部署您的应用程序。 为了解决这个问题, 转到 WAS 控制台并打开 应用程序 ==> 企业应用程序==> 管理器模块==>您的战争模块

    选择“首先使用本地类加载器加载的类(最后是父类)。”对于类加载器顺序

    点击“应用”和“保存”

    【讨论】:

    • 我也遇到了其他问题,但这解决了我的问题,+1。
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多