Po stronie serwera mamy podklasę RemoteServiceServlet, której używamy dla wszystkich implementacji usług. Wspomniałeś, że wydaje się to czasochłonne, ale oto jak wygląda kod. Zrobisz to raz i skończysz.
@Override
protected void doUnexpectedFailure(Throwable t) {
t.printStackTrace(System.err);
super.doUnexpectedFailure(t);
}
Uwaga: Nie rzeczywiście wysłać go do System.err i prawdopodobnie nie powinien albo, ale masz pomysł.
Po stronie klienta używamy podklasy AsyncCallback o nazwie AsyncSuccessCallback. Obsługuje on przypadek onFailure równomiernie dla większości naszych wywołań RPC. Większość naszego kodu zwrotnego może zajmować się sprawą onSuccess wiedząc, że onFailure jest obsługiwany. Zapewnia także jedno miejsce do późniejszej zmiany tej implementacji.
public abstract class AsyncSuccessCallback<T> implements AsyncCallback<T> {
public void onFailure(Throwable t) {
handleException(t);
}
protected void handleException(Throwable t) {
Window.alert(t.getMessage());
}
}
Uwaga: W rzeczywistości nie używamy Window.alert, ale znowu pojawia się pomysł. W takim przypadku wyświetlamy okno dialogowe GWT DialogBox, które wyświetla formularz, który wykonuje test POST na innym serwerze, który akceptuje raporty o błędach. Formularz pozwala użytkownikowi wpisać opis tego, co robił, gdy wystąpił błąd.
Po stronie klienta, jeśli chcesz uzyskać ślad stosu, trzeba napisać trochę więcej kodu:
// 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]";
}
}
Nie próbowałem jeszcze, ale wydaje się, że to właściwe rozwiązanie. Spróbuję, jak tylko będę miał zadanie związane z logowaniem. Do tego czasu zaznaczam to jako poprawne. – Zalivaka