bloggers bloggers

Marco Napolitano
Messaggi: 68
Stelle: 0
Data: 15/11/17
Jader Jed Francia
Messaggi: 50
Stelle: 0
Data: 22/09/17
Ezio Lombardi
Messaggi: 9
Stelle: 0
Data: 23/06/17
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
marcello marangio
Messaggi: 4
Stelle: 0
Data: 05/07/13
Marco Mancini
Messaggi: 1
Stelle: 0
Data: 05/06/13
Indietro

Liferay 6.1.0 GA1 e StackOverflowError

Liferay mette da tempo a disposizione degli sviluppatori un comodo plugin di Eclipse (www.liferay.com/community/wiki/-/wiki/Main/Liferay+IDE) per gestire tutte le configurazioni ed i deploy; il suo utilizzo consente infatti di creare nuovi progetti (portlet, temi, ...) all'interno del proprio workspace e di deployarli direttamente nel server interno censito in Eclipse, dando la possibilità di gestire proficuamente hot code deploy, debug, ..., senza l'ausilio dello script Ant.

Recentemente ho lavorato per un progetto sulla versione di Liferay 6.1.0 GA1 (Community Edition), secondo le modalità sopra, senza avere troppi problemi imprevisti.

Arrivati ad un certo punto dello sviluppo il server ha iniziato a sollevare inspiegabili eccezioni di tipo StackOverflowError in seguito a qualsiasi tipo di interazione con le portlet custom che erano state sviluppate; di fatto era diventato inutilizzabile.

Dopo alcune prove e ricerche ho scoperto che il problema erano gli hook, nello specifico la presenza del file liferay-hook.xml all'interno del mio progetto custom; non potendo rimuovere il file (necessario all'applicazione), l'unica soluzione è stata quella di rimuovere il mio progetto dal server interno di Eclipse e di ripristinare l'utilizzo dello script Ant. Avvio ed arresto del server rimangono comunque all'interno di Eclipse.

In conclusione esiste un bug all'interno di una classe di Liferay adibita al deploy che genera questo malfunzionamento; il bug è documentato qui, http://issues.liferay.com/browse/LPS-24723, ed è stato risolto già a partire con il rilascio della versione 6.1.1 GA2.

Enjoy!

Precedente
Commenti
Aggiungi Commento
Simona Cambo
Ciao,
devo inserire un link in una jsp per effettuare il download di un file. Poichè è all'interno di una sezione del Control Panel, ho creato un hook. Avete un esempio?
Mi sono da poco avvicinato a Liferay.
Grazie

Simona
Inviato il 09/07/15 14.02.
Marco Napolitano
Non capisco a cosa ti serva fare un hook; in generale per scaricare un file devi creare una resource url mediante la taglib <liferay-portlet:resourceURL> e gestire la richiesta nel metodo serveResource della tua portlet.
Da lì, attraverso la resourceResponse, puoi impostare il content type della risposta e recuperare l'outputstream su cui scrivere.

Marco
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Simona Cambo
Ciao Marco,
ho pensato ad un hook perchè devo inserire la jsp da zero all'interno della gestione utenti, presente in ROOT, e devo creare la classe java con il metodo che gestisce il download. Questa è l'idea che mi sono fatta, se però è sbagliata, puoi darmi per favore delle dritte o comunque un esempio di quanto da te descritto per meglio comprendere. Grazie
Inviato il 09/07/15 14.02 in risposta a Marco Napolitano.
Marco Napolitano
Adesso è più chiaro, va bene l'hook direi.
La classe che gestisce il download è sempre la classe Java della portlet che risponde ad un resource url come ho scritto sopra.
Siccome non puoi fare un hook di una portlet, potresti provare a creare una tua portlet custom e nella jsp fai un resource url che punta alla tua portlet per il download.
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Simona Cambo
Ma se creo un hook all'interno del quale metto la mia nuova jsp, non posso anche creare una classe java che estende BaseStrutsPortletAction e nel metodo processAction e render gestisco le operazioni del download? Dico questo perchè ho fatto la stessa cosa con l'upload di un file e gestirei tutto con questo hook integrando la parte di download.
Non capisco perchè se mi dici che va bene l'hook, devo crearmi una portlet custom? Mi manca qualche nozione base?
Inviato il 09/07/15 14.02 in risposta a Marco Napolitano.
Marco Napolitano
Le portlet Struts sono ormai deprecate, bisogna usare la classe MVCPortlet.
Facendo un hook di una JSP non fai altro che sovrascrivere un file di portale, ma eseguire una classe Java che il portale non conosce è un altro discorso; c'è un problema di classloading.
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Simona Cambo
Ti capisco in parte, scusami, nel senso che ok che sono deprecate le portlet Struts, ma se opero come ha fatto anche in precedenza per l'upload, ho problemi? Il problema di classloading è causato dal fatto che le classi inserite nell'hook non essendo presenti nel portale, non funzionano? Quando parli di portale ti riferisci al ROOT? Scusami se ti faccio queste domande banali, ma ho bisogno di capire perchè sto iniziando da poco a utilizzare Liferay
Inviato il 09/07/15 14.02 in risposta a Marco Napolitano.
Marco Napolitano
Se hai già provato con le portlet Struts e funziona, riprova allo stesso modo.
Male che vada c'è la portlet custom.
Cmq le classi di portale sono quelle di Liferay, non le tue; quindi in un certo senso ROOT.
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Simona Cambo
Sto avendo difficoltà a scrivere nella jsp il link. Inoltre come devo scrivere nel tag <portlet:resourceURL>, in maniera tale che Liferay capisca che deve andare nel metodo processAction della classe java che mi sono costruito? Aggiungo <portlet:param name"struts_action" value="....">? E poi devo scrivere nel LIFERAY-HOOK.XML il mapping?

Nel caso dell'upload ho fatto come segue e funziona:

nella JSP
<%String taglibOnSubmit = "event.preventDefault(); " + renderResponse.getNamespace() + "uploadUtenti();";%>

<aui:form method="post" name="fm" enctype="multipart/form-data" onSubmit="<%= taglibOnSubmit %>">
<aui:input type="file" id="filename" name="fileName" size="75"/>
<input type="submit" value="<liferay-ui:message key="upload" />" onClick="<%= uploadProgressId %>.startProgress(); return true;"/>
</aui:form>

<aui:script>
function <portlet:namespace />uploadUtenti() {
submitForm(document.<portlet:namespace />fm, "<portlet:actionURL><portlet:param name="struts_action" value="/users_admin/pippo" /></portlet:actionURL>");
}
</aui:script>

nel file LIFERAY-HOOK.XML
<struts-action>
<struts-action-path>/users_admin/pippo</struts-action-path>
<struts-action-impl>it.exprivia.kbms.action.usersimport.UsersUpload</struts-action-impl>
</struts-action>


NELLA CLASSE JAVA
public class UsersUpload extends BaseStrutsPortletAction {

@Override
public void processAction(StrutsPortletAction originalStrutsPortletAction, PortletConfig portletConfig, ActionRequest actionRequest, ActionResponse actionResponse)
throws Exception {

System.out.println("Sono nel metodo processAction");

.......

Grazie per le risposte che mi dai, mi sei stato di aiuto per fugare un pò di dubbi.
Inviato il 09/07/15 14.02 in risposta a Marco Napolitano.
Simona Cambo
Buongiorno Marco!
poi alla fine ieri sera sono riuscita a far funzionare tutto quanto il giro. Ti ringrazio per le tue risposte chiarificatrici.
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Marco Napolitano
bene, ottimo.
buon proseguimento allora!
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Simona Cambo
Ciao Marco,
ora mi sto imbattendo in un'altra esigenza banale, che però non riesco ad ottenere: abilitare e diabilitare un

pulsante al termine di un'operazione.
Mi spiego: il click di un pulsante inserito in un form fa scattare un javascript in cui c'è la submit che, tramite il

tag <portlet:namespace> e i suoi parametri chiama un metodo di una classe java. Subito dopo il submit, ritornando nel

javascript, devo abilitare il pulsante btn-avvia, all'interno di un form, che ho definito così:

<%
String avvia = "event.preventDefault(); " + renderResponse.getNamespace() + "importazione();";
%>

<aui:form method="post" name="fmImportazione" onSubmit="<%= avvia %>">
<aui:button type="submit" id="btn-avvia" name="btn-avvia" value="Avvia" disabled="true" />
</aui:form>


Inserendo l'opzione disabled a true funziona perchè parte disabilitato, ma quando poi setto l'opzione disabled a

false, nel javascript, dopo il submit, sembra che non succeda nulla. Sai spiegarmi come fare?
Mi dici, per favore, quale istruzione scrivere nel javascript per abilitare il pulsante? Forse sbaglio qualcosa
Grazie
Inviato il 09/07/15 14.02 in risposta a Marco Napolitano.
Marco Napolitano
Hai già provato con Alloy?
A.one('#ID_DEL_PULSANTE').attr('disabled', false);
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Simona Cambo
Ma cosa è A.one? non capisco. Cmq ho provato a scrivere quello ma non funziona. Come posso fare? Grazie
Inviato il 09/07/15 14.02 in risposta a Marco Napolitano.
Marco Napolitano
A partire da Liferay 6.0 è stato introdotto un nuovo framework Javascript che si chiama AlloyUI e sostituisce jQuery; A.one è una chiamata AlloyUI.
Purtroppo se non lo conosci temo che questa non sia proprio la sede più adatta per impararlo, non è una cosa da 2 minuti.
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Simona Cambo
Stavo appunto leggendo alcune informazioni e sono riuscito a realizzare il caso di un pulsante che abilita o meno un altro. Nel mio caso, però, non è il semplice click di un pulsante che ne abilita un altro, ma il click di un pulsante fa partire un javascript all'interno del quale c'è il metodo submitForm con il tag <portlet:actionURL> come parametro al fine di chiamare una classe java che esegue delle operazioni di back-end. Al ritorno dalla classe java,nel javascript, devo abilitare un pulsante definito all'interno di un altro fom. Il codice che ho scritto, che mi dovrebbe abilitare il pulsante è questo:
<aui:script>
function ......{
submitForm(document.<portlet:namespace />fm, "<portlet:actionURL><portlet:param name="struts_action"

value="/xxxx/pippo" /></portlet:actionURL>");

YUI().use('event', 'node', function (Y) {
var clickedNode = Y.one('#btn1');
alert(clickedNode);
var btn = Y.one('#btn2');
alert(btn);
btn.set('disabled', false);
btn.ancestor('.aui-button').removeClass('aui-button-disabled');
});
}

dove btn2 è il pulsante che parte disabilitato e che, al click del pulsante btn1, dopo il submit, deve abilitarsi. Spero sia stata chiara e spero mi possa aiutare. Grazie
Inviato il 09/07/15 14.02 in risposta a Marco Napolitano.
Marco Napolitano
quello che dici non ha molto senso perchè il submit del form implica anche il ricaricamento immediato dell'intera pagina di portale (è il normale funzionamento di un submit HTTP) e quindi la mancata esecuzione di qualsiasi Javascript.
forse dovresti ripensare il funzionamento della cosa.
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Simona Cambo
Ma mi stampa l'alert di una stringa, che ho inserito all'interno della function(y), credo che entri....
Inviato il 09/07/15 14.02 in risposta a Marco Napolitano.
Simona Cambo
Ciao Marco!
alla fine ci sono riuscita, creando una funzione javascript eseguita all'onload della pagina. Questa funzione che setta una variabile booleana che darà il valore alla property disabled del button. Il valore della variabile booleana dipende dal valore di un parametro che recupero dalla request.
Ora ho un altro problema, a cui speriamo tu sai darmi risposta. Da interfaccia devo lanciare un batch che fa alcune operazioni su DB. Di tali operazioni devo dare un feedback all'utente, in una pagina diversa da quella in cui ho lanciato il batch, attraverso una barra di progresso o la visualizzazione di una percentuale. La percentuale o la barra di progresso posso anche non aggiornarla in tempo reale e posso aggiornarla anche facendo un refresh con F5, quando voglio sapere quanto manca alla fine. Come posso operare? ho visto che esiste il <liferay-ui:upload-progress>, che nn riesco a far funzionare e il ProgressTracker, lato classe java. Puoi darmi qualche esempio? Ti sarei grata.
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.
Marco Napolitano
la progress bar è una buona soluzione ma su Liferay 6.1 ha un bug e non funziona.
puoi comunque orientarti su qualsiasi altra soluzione, che legge lo stato di avanzanmentoi da db.
Inviato il 09/07/15 14.02 in risposta a Simona Cambo.