JSF - MyFaces - 堆栈内存溢出

标签 jsf myfaces

我在渲染 JSF 页面时收到 StackOverflowError。它发生在加载一组特定的数据(成功发生)然后在页面上执行任何其他操作之后。请注意,如果发生错误后刷新页面,页面将正确加载。否则该页面工作正常,并且能够加载比错误情况下加载的记录更多的记录。

根据所采取的步骤,错误消息可能会略有不同,但错误始终会出现。

我正在使用 MyFaces 1.2(目前无法升级)。

这是一个常见问题并有解决方案吗?

示例1:

java.lang.StackOverflowError
at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:947)
at java.lang.ClassLoader.loadClass(ClassLoader.java:291)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:295)
at java.lang.ClassLoader.loadClass(ClassLoader.java:295)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:179)
at weblogic.utils.classloaders.FilteringClassLoader.findClass(FilteringClassLoader.java:101)
at weblogic.utils.classloaders.FilteringClassLoader.loadClass(FilteringClassLoader.java:86)
at java.lang.ClassLoader.loadClass(ClassLoader.java:295)
at java.lang.ClassLoader.loadClass(ClassLoader.java:295)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:179)
at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:45)
at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
at com.sun.el.parser.AstIdentifier.getValue(Unknown Source)
at com.sun.el.parser.AstDeferredExpression.getValue(Unknown Source)
at com.sun.el.parser.AstCompositeExpression.getValue(Unknown Source)
at com.sun.el.ValueExpressionImpl.getValue(Unknown Source)
at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
     ...

示例2:

java.lang.StackOverflowError
at javax.el.ELContext.(ELContext.java:222)
at com.sun.el.lang.EvaluationContext.(Unknown Source)
at com.sun.el.ValueExpressionImpl.getValue(Unknown Source)
at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
at com.sun.el.parser.AstIdentifier.getValue(Unknown Source)
at com.sun.el.parser.AstDeferredExpression.getValue(Unknown Source)
at com.sun.el.parser.AstCompositeExpression.getValue(Unknown Source)
at com.sun.el.ValueExpressionImpl.getValue(Unknown Source)
at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
     ...

更新:我已经解决了这个问题。标准 header 代码存在问题 - 它不喜欢所有参数。我没有编写下面的失败代码,但我必须修复它。 检查 Eclipse 中的堆栈(当命中 StackOverflowError 断点时),它在 (a) 行和 (b) 行(均命中 TagValueExpression.getValue(..))之间循环。

<c:forEach var="attr" items="#{request.parameterMap}">
                            <c:if test="#{empty flag}">
                            (a)    <c:set var="parameters" value="#{parameters}&amp;"/>
                            </c:if>
                            <c:set var="flag" value=""/>
                            (b)<c:set var="parameters" value="#{parameters}#{attr.key}=#{attr.value[0]}"/>
                        </c:forEach>

最佳答案

java.lang.StackOverflowError
    ...
    at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
    at com.sun.el.parser.AstIdentifier.getValue(Unknown Source)
    at com.sun.el.parser.AstDeferredExpression.getValue(Unknown Source)
    at com.sun.el.parser.AstCompositeExpression.getValue(Unknown Source)
    at com.sun.el.ValueExpressionImpl.getValue(Unknown Source)
    at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
    ...

因此,某些 EL 表达式引用自身,从而在无限递归循环中运行,导致堆栈溢出。

以下是最常见的原因之一,应该足够简单以理解问题:

<h:inputText binding="#{input}" value="#{input.value}" />

在上面的示例中,#{input} 指的是组件本身。 #{input.value} 指的是 value 属性。但是,如果您在 value 属性本身中使用它,那么这会在无限递归循环中不断向后引用 value 属性。在这种情况下,您需要通过将该值绑定(bind)到一个完整的托管 bean 属性来修复它。

检查您的页面是否存在此类逻辑错误。顺便说一句,组件是否绑定(bind)到托管 bean 并不重要,它也会失败:

<h:inputText binding="#{bean.input}" value="#{bean.input.value}" />

然后您应该使用

<h:inputText binding="#{bean.input}" value="#{bean.value}" />

或者也许只是这个

<h:inputText binding="#{bean.input}" />

甚至只是这样,取决于具体的功能需求

<h:inputText value="#{bean.value}" />

关于JSF - MyFaces - 堆栈内存溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9587055/

相关文章:

ajax - 使用 JSF 和 AJAX 渲染隐藏元素

java - JSF 表单不执行操作,因为组合框

jsf - IllegalArgumentException : com. ibm.ws.jsf.config.annotation.WASMyFacesAnnotationProvider 不是 org.apache.myfaces.spi.AnnotationProvider

java - 是否有从 inputText 到 URL 的任何标准 JSF 转换器?

java - 更改 PrimeFaces 中每页行值后数据表的奇怪行为

java - 根据复选框值调用 Javascript

jsf - Primefaces 数据表的列标题中的工具提示

ajax - MyFaces 不会将 javax.faces.ViewState 追加到无状态 View 的 ajax 更新上

jsf - 如何处理 Richfaces 中的代码错误 500

java - JSF - 如何在 <h :messages> in a visually appealing way? 中格式化我的全局消息