JSF - MyFaces - 堆栈溢出错误

时间:2012-03-06 15:48:31

标签: 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)
     ...

更新:我已解决了这个问题。标准标题代码中存在问题 - 它不喜欢所有参数。我没有写下面的失败代码,但我必须解决它。 检查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>

1 个答案:

答案 0 :(得分:3)

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属性。在这种情况下,您需要通过将值绑定到值得满足的托管bean属性来修复它。

检查您的网页是否存在此类逻辑错误。顺便说一句,如果组件绑定到托管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}" />