【发布时间】:2012-03-24 03:06:28
【问题描述】:
我在渲染 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}&"/>
</c:if>
<c:set var="flag" value=""/>
(b)<c:set var="parameters" value="#{parameters}#{attr.key}=#{attr.value[0]}"/>
</c:forEach>
【问题讨论】: