2012-11-12 16 views
6

Mam instalację Weblogic 10.3.3 i wydaje mi się, że mam problemy z rekurencyjnymi tagami JSP. W Internecie znalazłem kilka osób doświadczających tych samych problemów (here i here), ale bez rozwiązań. Niektórzy sugerują, że został on naprawiony w Weblogic 12 lub działał w 9, ale nie mogę tego potwierdzić.Weblogic i rekursywne tagi JSP

Aplikacja jest zbudowana przy użyciu Spring/Spring Roo/Apache Tiles/jspx. Klasa model, który jest wyświetlany jest coś takiego:

public class Programme { 

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

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

Wtedy mam Tagx tak:

<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> 

To nie działa. Podczas żądania strony kontener aplikacji wydaje się ulegać awarii (prawdopodobnie niektóre przepełnienie stosu, ale nie mogę go znaleźć w dziennikach), a kontekst aplikacji jest przeładowywany. W Tomcat 7 działa dobrze.

Wyjątkiem pokazany jest coś takiego, ale nie jestem pewien, czy jest to związane (ponieważ mówi o stronę błędu):

[ServletContext @ 483389576 [app: app-ear-0 moduł : appmodule path:/CONTEXTROOT spec-version: 2.5]] Wystąpił problem podczas wyświetlania strony błędu. org.springframework.web.util.NestedServletException: Przetwarzanie żądania nie powiodło się; Zagnieżdżony wyjątek to java.lang.ClassCastException: org.apache.tiles.ArrayStack pod adresem org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:894) pod adresem org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:779) w javax.servlet.http.HttpServlet.service (HttpServlet.java:707) w javax.servlet.http.HttpServlet.service (HttpServlet.java:821) w ...

Czy ktoś wcześniej doświadczył tych problemów, czy ktoś jest świadomy naprawy? Wszelkie wskazówki dotyczące debugowania tego lub sposób obejścia rekursywnego tagu (ponieważ chcę wyświetlić drzewo, jest to trochę wyzwanie). Z góry dziękuję.

+0

Czy próbujesz wywoływać rekursywnie znacznik programu? Mam podobny problem. Podczas wywoływania rekurencyjnie pliku znacznika działa on w Tomcat 6, ale nie w Weblogic 11. –

+0

Tak, to jest problem. Tomcat działa dobrze, ale Weblogic to pita. Nigdy nie znaleźliśmy rozwiązania tego problemu, z wyjątkiem przepisywania kodu, aby nie używać tagu rekursywnego. – MikeN

Odpowiedz

0

Nie mam pojęcia, jak naprawić silnik renderowania tagów. Ale moja odpowiedź brzmi: obejść, jak w ogóle wyeliminować rekursję. Pomysł na to, że rekursję można zmniejszyć za pomocą java.util.Stack. Następnie można utworzyć pole indentation że powie Ci ile przestrzenie powinny być zarezerwowane do wyświetlania drzewa jak struktura

kod Java na liście liniowej budować z wcięciem:

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)); 
    } 
} 

następnie w JSP można umieścić coś, tworzy marginesy (tam dopełnienie - po lewej stronie div pomnożone przez 10 pikseli):

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