2012-03-06 13 views
1

JSFページのレンダリング中にStackOverflowErrorを受け取っています。これは、特定のデータセットをロードした後(正常に実行された後)、ページ上で何か他の操作を行った後に発生します。エラーが発生した後にページがリフレッシュされると、ページが正しく読み込まれることに注意してください。このページは完璧に動作し、エラー状態でロードされたレコードよりも多くのレコードをロードすることができます。JSF - MyFaces - Stack Overflow Error

手順によっては、エラーメッセージが多少異なる場合がありますが、エラーは常に表示されます。

私は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) 
    ... 

アップデート:私は、問題を修正しました。標準ヘッダーコードに問題がありました。すべてのパラメーターが嫌いでした。私は以下の失敗したコードを書きませんでしたが、私はそれを修正する必要があります。 (StackOverflowErrorブレークポイントがヒットした)Eclipseでスタックをチェックすると、(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プロパティにバインドして修正する必要があります。

ロジックミスのこの種のページを確認してください。あなたはその後、もしかしたらこの

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

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

を使用するかしなければならない

:コンポーネントは管理Beanにバインドされているかどうかの方法によって、それはそれはのように良い失敗し、重要ではありません。
<h:inputText binding="#{bean.input}" /> 

あるいは単にこの、具体的な機能要件に応じて、

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

迅速な対応に感謝します。残念ながら、私は 'value'ベースのバインディングしか持っていません - ページに' binding'パラメータはありません。私は 'value ="#{bean.param} "と' value = "#{tableLoopItem.param}"といくつかの 'rendered =#{tableLoopItem.booleanParam}'だけを使用します。 – OddProblems

+2

これは最も一般的な原因のほんの一例に過ぎず、問題をよりよく理解することができます。これで、あなたのページで自己参照表現を探す必要があります。皆さんがどのようなコードを持っているのかわからないので、これを行うことはできません。 – BalusC

+0

問題に修正の詳細を追加しました。あなたの答えは正しい解決策に近く、将来的には他の貧しい人々を助けてくれるはずです。 – OddProblems

関連する問題