2012-03-06 3 views
1

Я получаю StackOverflowError при рендеринге страницы JSF. Это происходит после загрузки определенного набора данных (что происходит успешно), а затем делает что-либо еще на странице. Обратите внимание, что страница будет загружаться правильно, если она обновляется после возникновения ошибки. Страница работает совершенно иначе и может загружать больше записей, чем загружается в состояние ошибки.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) 
    ... 

Таким образом, некоторое выражение ЭЛ ссылается на самого и, таким образом, работает в бесконечном цикле рекурсии, вызывая переполнение стека.

Вот одна из наиболее распространенных причин, которые должны быть достаточно простыми, чтобы понять проблему:

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

Или, может быть, именно это

<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

Смежные вопросы