2012-03-06 1 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 식 자체로 참조되고, 따라서 스택 오버 플로우를 초래 무한 순환 루프에서 실행. #{input}은 성분 자체를 의미, 위의 예에서

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

:

찾는 문제를 이해하는 정도로 간단 할 가장 흔한 원인 중 하나이다. #{input.value}value 속성을 나타냅니다. 그러나 value 특성 자체에서 사용하면 무한 반복 루프에서 value 특성을 역 참조합니다. 이 경우 값을 전적인 값을 갖는 관리 빈 프로퍼티에 바인딩하여 수정해야합니다.

논리 실수의 종류를 확인하십시오. 그런 다음 단지 어쩌면이

<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