2010-03-02 8 views
6

sto distribuzione del portlet più semplice possibile per Liferay:Distribuzione di un semplice Portlet per Liferay - ClassCastException

public class FirstPortlet extends GenericPortlet 
{ 
    @RenderMode(name="VIEW") 
    public void welcomeWelcome(RenderRequest request, 
      RenderResponse response) throws 
      PortletException, IOException 
    {  
     PrintWriter out = response.getWriter(); 
     out.println ("This is a portlet, <em>within a Portal</em>"); 
    } 
} 

sulla distribuzione, sto diventando un ClassCastException:

Caused by: java.lang.ClassCastException: FirstPortlet cannot be cast to javax.po 
rtlet.Portlet 

Dopo Googling, sembra che distribuire portlet.jar sia un errore: mi sono assicurato che non lo stia facendo accidentalmente.

javax.portlet.Portlet è implementato da GenericPortlet e tutti gli esempi di portlet sembrano estendere GenericPortlet, quindi presumo che sia ok.

Qualcuno può aiutare?

risposta

8

javax.portlet.Portlet è implementato da GenericPortlet, e tutti i Portlet esempi sembrano estendersi GenericPortlet quindi immagino che è ok.

Se GenericPortlet implementa Portlet, la mia ipotesi è che avete un problema di class loader. La classe viene caricata due volte, in due caricatori di classi diverse e di conseguenza vengono considerate diverse.

Dopo Googling, sembra che la distribuzione portlet.jar è un errore - ho fatto in modo che io non sono accidentalmente fare questo.

Vorrei ancora suggerire che si fa doppio controllo se non si dispone di portlet.jar (o un altro vaso che contiene Portlet) caricato due volte da qualche parte. Le posizioni possibili dipendono dal contenitore che stai utilizzando (Tomcat? Glassfish?).

+0

eccellente, grazie - devo lasciare, ma ora vado a controllare questo appena ho può. Sono sicuro che è davvero un portlet.jar in più. Non è sicuramente nel mio file WAR. –

+0

Sì, era Tomcat - vedere la mia risposta a Jaromir, il portlet.jar è stato lasciato nella directory tomcat/webapps. –

6

Questo è sicuramente un problema di classloading. Se si è sicuro non si dispone di portlet.jar nell'archivio WAR, è possibile attivare il classload dettagliato e controllare da dove viene caricato javax.portlet.Portlet.

per trasformarsi verbose classloading passaggio seguente parametro alla JVM:

-verbose: class

+1

Ouch. Sì, grazie per le informazioni su verbose: class - che mi ha permesso di trovare la risposta. Sospetto che questa sia la mia stessa stupidità! Una volta avevo incluso il portlet includendo il file portlet.jar. Poi ho capito il mio errore e l'ho rimosso da tutte le distribuzioni future. Non mi ero ancora reso conto che il file jar è ancora lasciato nella directory tomcat/webapps. Correzione: eliminare la cartella appropriata dalla directory webapps e ridistribuirla nuovamente. –