我决定将日志系统添加到我的gwt服务层.首先我想记录从该层抛出的所有异常.我有一个类似于
Spring的ServletDispatcher的对象,它调用其他服务.我以为我可以在那里添加日志记录,但是我意识到GWT服务会在ServletResponse中包含检查的异常,并将其取消选中为UnexpectedException.
有人可以分享他的经验吗?记录所有GWT服务的检查和未检查的异常的最佳方式是什么?
我发现解决方案建议扩展RemoteServiceServlet并覆盖默认异常流.但是我觉得这个解决方案太耗时了.居民知道任何更容易的变种吗?
解决方法
在服务器端,我们有一个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]"; } }