2012-03-06 86 views
1

我在呈現JSF頁面時收到StackOverflowError。它發生在加載一組特定的數據(成功發生)之後,然後在頁面上做其他事情。請注意,如果錯誤發生後刷新頁面,頁面將正確加載。該頁面完美工作,否則可以加載更多的記錄,而不是在錯誤狀態下加載的記錄。JSF - MyFaces - 堆棧溢出錯誤

根據所採取的步驟,錯誤信息可能略有不同,但錯誤將始終顯示。

我正在使用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> 

回答

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}" /> 
+0

感謝您的快速響應。不幸的是,我只有'基於價值'的綁定 - 頁面上沒有'binding'參數。我只使用'value =「#{bean.param}」''和'value =「#{tableLoopItem.param}」'以及一些'rendered =#{tableLoopItem.booleanParam}'。 – OddProblems 2012-03-06 16:21:36

+2

這只是最常見原因的一個例子,所以可以更好地理解問題。現在您需要在頁面中查找自引用表達式。我們不能這樣做,因爲我們不知道你們都有什麼代碼。 – BalusC 2012-03-06 16:22:43

+0

我已將修復詳細信息添加到問題中。你的回答接近正確的解決方案,並有望在未來幫助其他可憐的靈魂。 – OddProblems 2012-03-07 21:58:11