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

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

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


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

在服务器端,我们有一个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 implements AsyncCallback { public void onFailure(Throwable t) { handleException(t); } protected void handleException(Throwable t) { Window.alert(t.getMessage()); } } 

注意:我们实际上并没有使用Window.alert,但是再一次,你明白了。 我们在这种情况下所做的是显示一个GWT DialogBox,它显示一个表单,该表单对接受错误报告的其他服务器执行POST。 该表单允许用户键入错误发生时他们正在做的事情的描述。

在客户端,如果要获取堆栈跟踪,则需要编写一些额外的代码:

 // for lineEnding, use "
" 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]"; } }

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

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

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

使用gwt-dispatch 。 日志记录可以嵌入到标准调度服务中,如下面的示例所示,我从gwt-dispatch“ 入门”页面中提取了该示例。

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