Sto eseguendo il debug di un'applicazione GWT e ho bisogno di stampare alcune cose sulla console a scopo di test. System.out.println
e GWT.log
non funzionano. Qualcuno ha qualche idea?
Risposte:
Citando la documentazione:
L'aggiunta della registrazione GWT è davvero molto semplice, semplice come il seguente esempio di codice. Tuttavia, capire come funziona la registrazione e come configurarla correttamente è importante, quindi dedica del tempo alla lettura del resto di questo documento.
http://code.google.com/webtoolkit/doc/latest/DevGuideLogging.html
Il modo più semplice per abilitare la registrazione è:
# In your .gwt.xml file
<inherits name="com.google.gwt.logging.Logging"/>
# In your .java file
Logger logger = java.util.logging.Logger.getLogger("NameOfYourLogger");
logger.log(Level.SEVERE, "this message should get logged");
Avevo bisogno di farlo nel contesto di un'applicazione GWT che è stata distribuita su un dispositivo / emulatore Android tramite PhoneGap (e gwt-phonegap). Né System.out.println () né la registrazione GWT come sopra (con dichiarazione del modulo) sono state visualizzate nel logcat di Android, quindi ho fatto ricorso a un semplice wrapper JSNI per console.log:
public void onModuleLoad()
{
Logger logger = Logger.getLogger("Test1.java");
logger.log(Level.INFO, "ash: starting onModuleLoad (1)"); // not in logcat
System.out.println( "ash: starting onModuleLoad (2)" ); // not in logcat
consoleLog( "ash: starting onModuleLoad (3)" ); // This shows up
...
}
native void consoleLog( String message) /*-{
console.log( "me:" + message );
}-*/;
Nella versione 2.6.0 di GWT, il metodo GWT.log scrive il messaggio nella console del browser, non è necessario scrivere metodi nativi.
Per accedere alla console dei browser puoi farlo utilizzando native, in un modo molto semplice. Molto utile per il debug.
Se aggiungi un metodo nativo come in seguito, puoi inviargli una stringa da dove desideri e verrà registrato nella console del browser.
public static native void console(String text)
/*-{
console.log(text);
}-*/;
Per ulteriori informazioni sull'utilizzo del nativo in GWT: http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html
Sto solo riassumendo le diverse possibilità mostrate nelle risposte di mreppy e Strelok in uno snippet. Ho anche aggiunto una possibile soluzione alternativa per le eccezioni di IE come descritto qui: Perché JavaScript funziona solo dopo aver aperto gli strumenti per sviluppatori in IE una volta?
java.util.logging.Logger logger = Logger.getLogger(this.getClass().getSimpleName());
native void jsConsoleLog(String message) /*-{
try {
console.log(message);
} catch (e) {
}
}-*/;
private void log(final String message) {
// Logs to Dev mode console only
GWT.log(message);
// Logs to Dev mode and JavaScript console (requires configuration)
this.logger.log(Level.FINEST, message);
// Logs to JavaScript console only
jsConsoleLog(message);
Ancora un'altra variazione utilizzando la console nativa ...
Aggiungi questa classe:
package XXX.XXX.XXX.XXX;
public class Debug {
private static boolean isEnabled_ = false;
public static void enable() { isEnabled_ = true; }
public static void setEnabled( final boolean isEnabled )
{ isEnabled_ = isEnabled; }
public static void log( final String s )
{ if( isEnabled_ ) nativeConsoleLog( s ); }
private static native void nativeConsoleLog( String s )
/*-{ console.log( s ); }-*/;
}
Quindi, abilita il debug con esso ad un certo punto, come all'avvio dell'app:
public class XXXXXX implements EntryPoint {
@Override
public void onModuleLoad() {
Debug.enable();
...
}
}
Quindi usalo in questo modo:
Debug.log("Hello World!");
Anch'io ho avuto questo problema. Il registro di GWT funziona ma poiché è tutto convertito in javascript, viene stampato nell'output del client, quindi visualizza la console del tuo browser e saranno lì. In Google Chrome fai clic sul pulsante Personalizza a tre righe in alto a destra, fai clic su Strumenti -> Strumenti per sviluppatori e verrà visualizzata la console. Le tue ambite dichiarazioni saranno lì. Inoltre, Ctrl + Maiusc + I è la scorciatoia che lo fa apparire. Se vuoi stampare sul server, credo che i gestori di logger e simili siano in ordine?
L'URL della documentazione nella prima risposta fornisce già la diversa opzione di configurazione per accedere a luoghi diversi. Questo framework che ho scritto ti offre un'utile API e ti permette di scegliere la tua implementazione di logging lato server. Dai un'occhiata: https://code.google.com/p/gwt-usefull-logging/
Ti suggerisco di utilizzare la modalità GWT Developer Aggiunge un piccolo sovraccarico perché la compilazione automatica e l'allocazione del codice sul server del codice, ma è abbastanza chiaro quando sorgono alcune eccezioni nel lato client della tua applicazione. Voglio dire, a volte la console chrome (o firebug o qualsiasi altro strumento integrato per il debug del browser) non dice troppo in quelle situazioni, credimi, trovare una NullPointerException è una seccatura quando cerchi di capire cosa sta succedendo avvisando il tuo codice.
Per la stampa sulla console del browser sto usando qualcosa del genere:
public class EventLogger {
public static void logEvent(String subsys, String grp, String type) {
logEvent(GWT.getModuleName(), subsys, grp,
Duration.currentTimeMillis(), type);
}
public static native void logEvent(String module, String subsys,
String grp, double millis, String type)
/*-{
if ($wnd.__gwtStatsEvent) {
$wnd.__gwtStatsEvent({
'moduleName':module,
'subSystem':subsys,
'evtGroup':grp,
'millis':millis,
'type':type
});
}
}-*/;
}