GWT服务异常日志记录的最佳实践

时间:2010-11-16 10:53:25

标签: java spring exception gwt logging

我决定将日志系统添加到我的gwt服务层。首先,我想记录从该层抛出的所有异常。我有一个类似于Spring的ServletDispatcher的对象,它调用其他服务。我以为我可以在那里添加日志记录,但我意识到GWT服务在ServletResponse中包装了已检查的异常并且未经检查到UnexpectedException。

有人可以分享他对这个问题的经验吗?记录所有GWT服务的已检查和未检查异常的最佳方法是什么。


我找到了建议扩展 RemoteServiceServlet 并覆盖默认异常流的解决方案。但我发现这个解决方案太费时间了。 anybode知道任何更简单的变体吗?

3 个答案:

答案 0 :(得分:12)

在服务器端,我们有一个RemoteServiceServlet的子类,我们将其用于所有服务实现。你提到它似乎很耗时,但这就是代码的样子。你做了一次而且你已经完成了。

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

注意:我们实际上并没有将它发送给System.err,你可能也不应该这样做,但是你明白了。

在客户端,我们使用AsyncCallback的子类AsyncSuccessCallback。它为大多数RPC调用统一处理onFailure情况。我们的大部分回调代码都可以处理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 :(得分:1)

您要记录哪些例外?客户端还是服务器端? 我们有一个gwt的大型企业应用程序。我们在客户端上使用MVP模式,并且使用通用RPCservice类完成对服务器的所有请求。 例如 saveUserService = new remoteService();

在服务器端,我们处理SaveUserRequest并使用命令模式准备SaveUserResponse。 除了ClientWarningException之外,所有异常都在那里处理,它们会传播到我们向用户显示一条好消息的客户端。

这可能有点冗长,但它在一个大约100k loc的大应用程序上得分很好。

答案 2 :(得分:1)

使用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;
        }
    }
}