Лучшие практики для регистрации исключений сервисов GWT - PullRequest
9 голосов
/ 16 ноября 2010

Я решил добавить систему журналирования на свой сервисный уровень gwt.Прежде всего я хотел записать все исключения, которые выбрасываются из этого слоя.У меня был объект, похожий на Spring ServletDispatcher, который вызывает другие службы.Я думал, что смогу добавить туда логирование, но понял, что сервисы GWT оборачивают проверенные исключения в ServletResponse и не проверяют в UnexpectedException.

Кто-нибудь может поделиться своим опытом с этой проблемой?Каков наилучший способ регистрировать отмеченные и непроверенные исключения для всех сервисов GWT.


Я нашел решение, которое предлагает расширить RemoteServiceServlet и переопределить поток исключений по умолчанию.Но я считаю это решение слишком трудоемким.Кто-нибудь знает какой-нибудь более простой вариант?

Ответы [ 3 ]

12 голосов
/ 18 января 2011

На стороне сервера у нас есть подкласс RemoteServiceServlet, который мы используем для всех реализаций сервисов. Вы упоминаете, что это кажется трудоемким, но вот как выглядит код. Вы делаете это один раз, и все готово.

@Override
protected void doUnexpectedFailure(Throwable t) {
    t.printStackTrace(System.err);
    super.doUnexpectedFailure(t);
}

Примечание. На самом деле мы не отправляем его в System.err, и вы, вероятно, тоже не должны этого делать, но вы поняли идею.

На стороне клиента мы используем подкласс AsyncCallback, называемый AsyncSuccessCallback. Он обрабатывает случай onFailure единообразно для большинства наших вызовов RPC. Большая часть нашего кода обратного вызова может работать со случаем onSuccess, зная, что onFailure обрабатывается. Это также предоставляет единственное место для изменения этой реализации позже.

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

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

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

}

Примечание. На самом деле мы не используем Window.alert, но, опять же, вы поняли идею. В данном случае мы отображаем диалоговое окно GWT DialogBox, которое отображает форму, которая выполняет процедуру POST на другом сервере, который принимает отчеты об ошибках. Форма позволяет пользователю ввести описание того, что он делал, когда произошла ошибка.

На стороне клиента, если вы хотите получить трассировку стека, вам нужно написать немного дополнительного кода:

// 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]";
    }
}
1 голос
/ 18 января 2011

Использование gwt-dispatch . Ведение журнала может быть встроено в стандартную диспетчерскую службу, как показано в следующем примере, который я поднял со страницы 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;
        }
    }
}
1 голос
/ 16 ноября 2010

В каких исключениях вы хотите войти?Клиентская или серверная сторона?У нас есть большое корпоративное приложение с gwt.Мы используем шаблон MVP на клиенте, и все запросы к серверу выполняются с использованием универсального класса RPCservice.Например, saveUserService = new remoteService ();

на стороне сервера мы обрабатываем SaveUserRequest и подготавливаем SaveUserResponse, используя шаблон команды.Все исключения обрабатываются там, кроме ClientWarningException, который остается распространяться до клиента, где мы отображаем приятное сообщение для пользователя.

Возможно, это немного многословно, но оно хорошо масштабируется в большом приложенииоколо 100k loc.

...