2010-11-16 16 views
9

Postanowiłem dodać system logowania do mojej warstwy usługi gwt. Przede wszystkim chciałem zarejestrować wszystkie wyjątki, które są wyrzucane z tej warstwy. Miałem obiekt podobny do Springa ServletDispatcher, który wywołuje inne usługi. Pomyślałem, że mogę dodać tam rejestrowanie, ale zdałem sobie sprawę, że usługi GWT zawierają wyjątki sprawdzane w ServletResponse i odznaczone w UnexpectedException.Najlepsze wskazówki dotyczące rejestrowania wyjątków usług GWT

Czy ktokolwiek może podzielić się swoimi doświadczeniami z tym problemem? Jaki jest najlepszy sposób rejestrowania zaznaczonych i niezaznaczonych wyjątków dla wszystkich usług GWT.


znalazłem rozwiązanie, które proponuje rozszerzyć RemoteServiceServlet i zastąpić domyślne wyjątki płynąć. Ale uważam, że to rozwiązanie jest zbyt czasochłonne. Czy anybode zna jakiś łatwiejszy wariant?

Odpowiedz

12

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]"; 
    } 
} 
+0

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

1

Jakie wyjątki chcesz rejestrować? Strona klienta lub strona serwera? Mamy dużą aplikację korporacyjną z gwt. Używamy wzorca MVP na kliencie, a wszystkie żądania do serwera są wykonywane przy użyciu ogólnej klasy RPCservice. Na przykład saveUserService = new remoteService();

po stronie serwera przetwarzamy SaveUserRequest i przygotowujemy SaveUserResponse za pomocą wzorca polecenia. Wszystkie wyjątki są tam traktowane, z wyjątkiem wyjątku ClientWarningException, który został pozostawiony do propagacji do klienta, w którym wyświetlamy użytkownikowi ładną wiadomość.

To może trochę gadatliwe, ale skalowalo się dobrze na dużej aplikacji z około 100k loc.

+0

Przede wszystkim potrzebuję dzienników po stronie serwera dla warstwy usługi. – Zalivaka

+0

O twojej sugestii nie jest dla mnie jasne. Możesz to wyjaśnić? Jak rozumiem, zawijasz wyjątek w obiekcie odpowiedzi, czy jest on budowany w ten sposób? – Zalivaka

+0

Wszystkie wyjątki po stronie serwera powinny być już zarejestrowane przez twój log z wyboru (lub sysout). Postanowiliśmy potraktować wyjątki w szczególny sposób i pozwolić im wznieść się do klienta, aby przekazać użytkownikowi pomocne informacje. Na przykład błędy sprawdzania poprawności. – Uberto

1

Korzystając gwt-dispatch. Rejestrowanie może zostać osadzone w standardowej usłudze wysyłkowej, jak pokazano w poniższym przykładzie, który został usunięty ze strony gwt-dispatch Getting Started.

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; 
     } 
    } 
} 
Powiązane problemy