2012-11-12 3 views
6

Weblogic 10.3.3 설치가 있고 재귀 JSP 태그에 문제가있는 것으로 보입니다. 인터넷에서 동일한 문제 (herehere)를 경험 한 다른 사람들을 발견했으나 해결 방법이 없습니다. 어떤 사람들은 Weblogic 12에서 수정되었거나 9에서 작업 중이라고 제안하지만이를 확인할 수는 없습니다.Weblogic 및 재귀 JSP 태그

응용 프로그램은 Spring/Spring Roo/Apache Tiles/jspx를 사용하여 작성됩니다.

public class Programme { 

private String name; 
private final List<Programme> programmes = new ArrayList<Programme>(); 

...(getter/setter)... 
} 

그런 다음 나는 tagx과 같이 있습니다 :이 작동하지 않습니다

<jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:coursedataimport="urn:jsptagdir:/WEB-INF/tags/coursedataimport" version="2.0"> 
    <jsp:output omit-xml-declaration="yes" /> 

    <jsp:directive.attribute name="programme" type="package.Programme" required="true" rtexprvalue="true" /> 

    <c:out value="${programme.name}" /> 

    <ul> 
     <c:forEach var="p" items="${programme.programmes}"> 
      <li><coursedataimport:programme programme="${p}" /></li> 
     </c:forEach> 
    </ul> 

</jsp:root> 

표시되는 모델 클래스는 같은 것입니다. 페이지를 요청할 때 응용 프로그램 컨테이너가 손상된 것 같습니다 (스택 오버플로가있을 수 있지만 로그에서 찾을 수 없음). 응용 프로그램 컨텍스트가 다시로드됩니다. Tomcat 7에서는 잘 작동합니다.

표시된 예외가 이런 일이지만,이 관련이있는 경우 (이 오류 페이지에 대해 이야기하기 때문에) 잘 모르겠어요 :

[ServletContext에 @ 483389576 [응용 프로그램 : 앱 귀 0 모듈을 : appmodule path :/CONTEXTROOT spec-version : 2.5]] 오류 페이지를 처리하는 중에 문제가 발생했습니다. org.springframework.web.util.NestedServletException : 요청 처리에 실패했습니다. 중첩 예외는 java.lang.ClassCastException입니다 : org.apache.tiles.ArrayStack at org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:894) at org.springframework.web.servlet.FrameworkServlet.doGet ( 에서 javax.servlet.http.HttpServlet.service (HttpServlet.java:821)에서 javax.servlet.http.HttpServlet.service (HttpServlet.java:707)에서 FrameworkServlet.java:779) ...

이전에이 문제가 발생했거나 해결 방법을 알고있는 사람이 있습니까? 이것을 디버깅하는 방법이나 재귀 태그를 해결하는 방법에 대한 팁 (트리를 표시하고 싶기 때문에 약간의 어려움이 있습니다). 미리 감사드립니다.

+0

재귀 적으로 프로그램 태그를 호출하려고합니까? 비슷한 문제가 있습니다. 재귀 적으로 태그 파일을 호출하는 동안 Tomcat 6에서는 작동하지만 Weblogic 11에서는 작동하지 않습니다. –

+0

네, 그게 문제입니다. Tomcat은 잘 작동하지만 Weblogic은 피타입니다. 우리는 반복적 인 태그를 사용하지 않도록 코드를 다시 작성하는 것과 별개로 솔루션을 찾지 못했습니다. – MikeN

답변

0

태그 렌더링 엔진을 수정하는 방법을 알지 못합니다. 하지만 내 대답은 작업 - 재귀를 전혀 제거하는 방법에 관한 것입니다. java.util.Stack을 사용하면 재귀를 줄일 수 있다는 아이디어가 있습니다. 그럼 당신은 트리 구조가

이 들여 쓰기 빌드 선형 목록

자바 코드 표시하기 위해 예약되어야하는 공간 필드를 알 수 indentation를 만들 수 있습니다 그 후

class FormattedProgramme{ 
    Programme programme; 
    int indent; 
} 
... 
java.util.List<FormattedProgramme> result = new ArrayList<FormattedProgramme>(); 
java.util.Stack<FormattedProgramme> programmeStack = 
    new java.util.Stack<FormattedProgramme>(); 
//you should know how to resolve root bean 'programme' 
programmeStack.push(new FormattedProgramme(programme, 0/*indent=0*/)); 

while(!programmeStack.empty()){ 
    FormattedProgramme parent = programmeStack.pop(); 
    result.add(parent); 
    for(Programme child:parent.programme.programmes){ 
     //create child item with indentation + 1 
     //may be you need keep order of items - then reverse this loop 
     programmeStack.push(new FormattedProgramme(child, parent.indent+1)); 
    } 
} 

는 JSP에서 당신이 뭔가를 배치 할 수 패딩을 만듭니다 (div의 왼쪽에 10px 곱함).

<c:forEach var="fp" items="${formatted}"> 
    <div style='padding-left:${fp.indent * 10}px'> 
     <c:out value="${fp.programme.name}" /> 
    </div> 
</c:forEach>