【问题标题】:Error 500: java.lang.StackOverflowError in WAS 7错误 500:WAS 7 中的 java.lang.StackOverflowError
【发布时间】:2012-01-25 18:53:58
【问题描述】:

我正在尝试让世界上最简单的 JSF 应用程序在 Websphere 服务器上运行。该应用程序由两个 xhtml 文件和 web.xml 文件组成。该应用程序可以毫无问题地编译、构建和安装。当我尝试在浏览器中查看页面时,我得到:

错误 500:java.lang.StackOverflowError

页面和日志中均未显示任何其他内容。我已经在谷歌上搜索了几个小时,但找不到解决方案。

这是我的 web.xml 文件:

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</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>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

这里是 JSF 页面:

<f:view>
<h:form>
    <h:panelGrid columns="1">
        <h:outputLabel value="Carrier" />

        <h:outputLabel value="Item Number: " />

        <h:outputLabel value="Postal Code: " />

        <h:outputLabel value="Quantity: " />

    </h:panelGrid>  

</h:form>
</f:view>

这是一个如此简单的应用程序,我无法想象它为什么无法运行。非常感谢任何帮助。

哦,让我补充一下,该应用程序可以在 Glassfish 和 Webspere CE 上完美运行,但不能在 Websphere Express v7 上运行。当然我需要它在 Websphere Express v7 上运行。

【问题讨论】:

    标签: jsf jakarta-ee websphere websphere-7


    【解决方案1】:

    显然 actual 视图文件没有.jspx 扩展名,而是.xhtml 扩展名。因此,FacesServlet 将在每次调用自身的无限循环中运行,最终导致内存堆栈溢出。

    要解决此问题,您需要从web.xml删除此条目:

    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.jspx</param-value>
    </context-param>
    

    它已经默认为.xhtml

    我还建议删除此映射:

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

    坚持在网址中使用.xhtml 扩展名,例如http://localhost:8080/context/page.xhtml


    更新:我的错误。 WAS 7 根本支持 JSF 2.0。它仅支持 JSF 1.2。另请参阅WAS documentation。您需要 JSP 文件而不是 Facelets (XHTML) 文件。您也无法利用 JSF 2.0 的优势。

    要让 JSF 2.0 在 WAS 7 中工作,您需要自己将其捆绑在 webapp 的 /WEB-INF/lib 中并配置 WAS 类加载器策略。另见this link

    即使 Websphere 7 没有正式支持 JSF 2.0,您也可以让它在降级模式下工作。请按照以下步骤使其在您的 Websphere 7 版本上运行。

    • 至少升级到版本 7.0.0.13
    • 将 Mojarra JAR 文件发送到您的 WEB-INF/lib 目录中
    • 将 WAR 类加载器设置为 PARENT_LAST
    • 将 EAR 类加载器设置为 PARENT_LAST 和 APPLICATION

    请注意,降级模式意味着您将无法使用 @Resource 或任何 JPA 注释。如果您认为需要支持,请联系您的 IBM 代表。

    注意它会处理@PostConstruct 和@PreDestroy。

    【讨论】:

    • 感谢 BalusC。我确实有 .xhtml 作为参数值并且得到了同样的错误。在另一个站点上阅读 cmets 后,我将其更改为 .jspx。无论我似乎在 context-param/param-value 中输入了什么值,我仍然会收到 stackoverflow 错误。
    • 您的实际文件有什么扩展名? (应该是.xhtml/WEB-INF/lib 中有哪些 JAR? (对于 WAS,您实际上应该没有人)您的 faces-config.xml 根声明是什么样的? (对于 JSF 2.0,你需要一个兼容 JSF 2.0 的)
    • 没有jar文件,也没有faces-config.xml。我只是想让一个页面显示一些基本的 jsf 标签。我所有的页面/文件都有 .xhtml 扩展名。没有处理或逻辑,只是一个带有一些标签的简单页面。可能是什么问题?我已经尝试了所有方法,据我所知,我的所有代码都是正确的。
    【解决方案2】:

    如果由于某种原因您需要使用 JSF 1.2 而不是 2.0

    您可以尝试将Facelets 库添加到项目中。

    并将以下内容添加到 faces-config.xml

    <faces-config>
        .
        .
        <application>
            <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
        </application>
        .
        .
    </faces-config>
    

    现在您可以在 JSF 1.2 下使用 .xhtml 代替 .jsp

    【讨论】:

      猜你喜欢
      • 2013-04-16
      • 2023-03-28
      • 1970-01-01
      • 2013-04-05
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多