2010-11-16 4 views
9

Ich entschied mich, das Logging-System zu meiner gwt-Service-Schicht hinzuzufügen. Zuallererst wollte ich alle Ausnahmen protokollieren, die von diesem Layer geworfen werden. Ich hatte ein Objekt ähnlich dem ServletDispatcher von Spring, der andere Dienste aufruft. Ich dachte, ich könnte die Protokollierung dort hinzufügen, aber ich erkannte, dass GWT-Dienste überprüft Ausnahmen in ServletResponse und deaktiviert in UnexpectedException.Best Practices für die Protokollierung von GWT-Services-Ausnahmen

Kann jemand seine Erfahrung mit diesem Problem teilen? Was ist der beste Weg, überprüfte und ungeprüfte Ausnahmen für alle GWT-Dienste zu protokollieren?


fand ich die Lösung RemoteServiceServlet und überschreiben Standard Ausnahmen fließen verlängern lässt. Aber ich finde diese Lösung zu zeitaufwendig. Kennt anybode eine einfachere Variante?

Antwort

12

Auf der Serverseite haben wir eine Unterklasse von RemoteServiceServlet, die wir für alle Service-Implementierungen verwenden. Sie erwähnen, dass es zeitaufwendig scheint, aber hier ist, wie der Code aussieht. Du machst es einmal und du bist fertig.

Hinweis: Wir senden es nicht wirklich an System.err und Sie sollten wahrscheinlich auch nicht, aber Sie bekommen die Idee.

Auf der Clientseite verwenden wir eine AsyncCallback-Unterklasse namens AsyncSuccessCallback. Es behandelt den onFailure-Fall einheitlich für die meisten unserer RPC-Aufrufe. Der Großteil unseres Rückrufcodes kann mit dem onSuccess-Fall umgehen, da er weiß, dass onFailure behandelt wird. Es bietet auch einen einzigen Ort, um diese Implementierung später zu ändern.

public abstract class AsyncSuccessCallback<T> implements AsyncCallback<T> { 

    public void onFailure(Throwable t) { 
     handleException(t); 
    } 

    protected void handleException(Throwable t) { 
     Window.alert(t.getMessage()); 
    } 

} 

Hinweis: Wir verwenden eigentlich nicht Window.alert, aber Sie bekommen die Idee. In diesem Fall zeigen wir eine GWT-DialogBox an, die ein Formular anzeigt, das einen POST an einen anderen Server sendet, der Fehlerberichte akzeptiert. Das Formular ermöglicht dem Benutzer, eine Beschreibung dessen einzugeben, was sie bei Auftreten des Fehlers getan haben.

Auf der Client-Seite, wenn Sie die Stack-Trace erhalten möchten, müssen Sie ein wenig mehr Code schreiben:

// for lineEnding, use "<br>" for HTML, "\n" for text 
public static final String getStackTrace(Throwable t, String lineEnding) { 
    Object[] stackTrace = t.getStackTrace(); 
    if (stackTrace != null) { 
     StringBuilder output = new StringBuilder(); 
     for (Object line : stackTrace) { 
      output.append(line); 
      output.append(lineEnding); 
     } 
     return output.toString(); 
    } else { 
     return "[stack unavailable]"; 
    } 
} 
+0

Ich habe es noch nicht ausprobiert, aber es scheint die richtige Lösung zu sein. Ich werde es versuchen, sobald ich eine Aufgabe mit der Protokollierung verbunden habe. Bis dahin markiere ich es als richtig. – Zalivaka

1

Welche Ausnahmen möchten Sie protokollieren? Client-Seite oder Server-Seite? Wir haben eine große Unternehmensanwendung mit gwt. Wir verwenden das MVP-Muster auf dem Client, und die gesamte Anforderung an den Server erfolgt über eine generische RPC-Serviceklasse. Zum Beispiel saveUserService = new remoteService();

auf der Serverseite verarbeiten wir die SaveUserRequest und bereiten SaveUserResponse mit dem Befehlsmuster vor. Alle Ausnahmen werden behandelt, abgesehen von der ClientWarningException, die bis zum Client weitergegeben werden, wo wir eine nette Nachricht für den Benutzer anzeigen.

Dies ist vielleicht ein wenig ausführlich, aber es skaliert gut auf einer großen App mit etwa 100k loc.

+0

Zuerst brauche ich eine Server-Seite Protokolle für die Service-Schicht. – Zalivaka

+0

Über Ihren Vorschlag ist es mir nicht klar. Kannst du es erklären? Wie ich verstehe, wickeln Sie Ausnahme in Antwortobjekt, ist es so gebaut? – Zalivaka

+0

Alle Ausnahmen auf der Serverseite sollten bereits von Ihrem Protokoll der Wahl (oder Sysout) protokolliert werden. Wir haben uns entschieden, einige Ausnahmen auf eine spezielle Art und Weise zu behandeln und sie dem Kunden zur Verfügung zu stellen, um dem Benutzer hilfreiche Informationen zu geben. Zum Beispiel Validierungsfehler. – Uberto

1

Verwendung gwt-dispatch. Die Protokollierung kann in den Standard-Versanddienst eingebettet werden, wie im folgenden Beispiel gezeigt, das ich von der Seite Getting Started von gwt-dispatch abgehandelt habe.

public class SimpleDispatchServlet extends RemoteServiceServlet 
     implements StandardDispatchService { 

    private Dispatch dispatch; 

    public SimpleDispatchServlet() { 
     InstanceActionHandlerRegistry registry = 
      new DefaultActionHandlerRegistry(); 
     registry.addHandler(new IncrementCounterHandler()); 
     dispatch = new SimpleDispatch(registry); 
    } 

    public Result execute(Action<?> action) throws DispatchException { 
     try { 
      return dispatch.execute(action); 
     } catch (RuntimeException e) { 
      log("Exception while executing " + action.getClass().getName() 
       + ": " + e.getMessage(), e); 
      throw e; 
     } 
    } 
}