2012-11-12 15 views
6

Ho un'installazione Weblogic 10.3.3 e sembra che abbia problemi con i tag JSP ricorsivi. Su Internet ho trovato altre persone che hanno riscontrato gli stessi problemi (here e here), ma nessuna soluzione. Alcune persone suggeriscono che sia stato risolto in Weblogic 12 o che funzionasse in 9, ma non posso confermarlo.Tag JSP weblogic e ricorsivo

L'applicazione viene creata utilizzando Spring/Spring Roo/Apache Tiles/jspx. La classe del modello che viene visualizzata è qualcosa di simile:

public class Programme { 

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

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

poi ho un Tagx come questo:

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

Questo non funziona. Quando si richiede la pagina, il contenitore dell'applicazione sembra bloccarsi (probabilmente qualche overflow dello stack, ma non riesco a trovarlo nei log) e il contesto dell'applicazione viene ricaricato. In Tomcat 7 funziona perfettamente.

L'eccezione indicata è qualcosa di simile, ma non sono sicuro se è collegato (in quanto parla della pagina di errore):

[ServletContext @ 483.389.576 [app: modulo app-ear-0 : percorso appmodule:/CONTEXTROOT spec-version: 2.5]] Si è verificato un problema durante la pubblicazione della pagina di errore. org.springframework.web.util.NestedServletException: elaborazione richiesta non riuscita; l'eccezione nidificata è java.lang.ClassCastException: org.apache.tiles.ArrayStack a org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:894) a org.springframework.web.servlet.FrameworkServlet.doGet (FrameworkServlet.java:779) a javax.servlet.http.HttpServlet.service (HttpServlet.java:707) a javax.servlet.http.HttpServlet.service (HttpServlet.java:821) a ...

Qualcuno ha riscontrato questi problemi prima o qualcuno è a conoscenza di una correzione? Qualche suggerimento su come eseguire il debug di questo o su come aggirare il tag ricorsivo (dal momento che voglio visualizzare un albero, è un po 'una sfida). Grazie in anticipo.

+0

Si sta tentando di chiamare il tag del programma in modo ricorsivo? Ho un problema simile. Durante la chiamata in modo ricorsivo, un file di tag funziona in Tomcat 6, ma non in Weblogic 11. –

+0

Sì, questo è il problema. Tomcat funziona bene con esso, ma Weblogic è una pita. Non abbiamo mai trovato una soluzione per questo oltre a riscrivere il codice in modo che non utilizzi un tag ricorsivo. – MikeN

risposta

0

Non ho idea di come correggere il motore di rendering dei tag. Ma la mia risposta è lavorare su come eliminare la ricorsione. Idea dietro che qualsiasi ricorsione può essere ridotta dall'uso di java.util.Stack. Quindi è possibile creare campo indentation che ti dice quanti spazi dovrebbe essere riservato per visualizzare albero-come la struttura

codice Java sulla lista lineare di compilazione con rientro:

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

Dopo che in JSP è possibile inserire qualcosa che crea padding (là padding-left di div moltiplicato per 10px):

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