Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GWT服务异常日志记录的最佳实践_Java_Spring_Exception_Gwt_Logging - Fatal编程技术网

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

Java GWT服务异常日志记录的最佳实践,java,spring,exception,gwt,logging,Java,Spring,Exception,Gwt,Logging,我决定将日志系统添加到gwt服务层。首先,我想记录从该层抛出的所有异常。我有一个类似于Spring的ServletDispatcher的对象,它调用其他服务。我想我可以在那里添加日志记录,但我意识到GWT服务将检查过的异常包装在ServletResponse中,而将未检查的异常包装到UnexpectedException中 有人能分享一下他对这个问题的经验吗?记录所有GWT服务的已检查和未检查异常的最佳方法是什么 我找到了建议扩展RemoteServiceServlet并覆盖默认异常流的解决方

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

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



我找到了建议扩展RemoteServiceServlet并覆盖默认异常流的解决方案。但我觉得这个解决方案太耗时了。有人知道更简单的变体吗?

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

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


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

在服务器端,我们有一个子类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());
    }

}
公共抽象类AsyncSuccessCallback实现AsyncCallback{
失效时的公共无效(可丢弃的t){
手部异常(t);
}
受保护的无效句柄异常(可丢弃的t){
Window.alert(t.getMessage());
}
}
注意:我们实际上并没有使用Window.alert,但您还是明白了。在本例中,我们要做的是显示一个GWT对话框,该对话框显示一个表单,该表单向接受错误报告的其他服务器进行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]";
    }
}
//对于行尾,对HTML使用“
”,对文本使用“\n” 公共静态最终字符串getStackTrace(可丢弃的t,字符串行结束){ 对象[]stackTrace=t.getStackTrace(); if(stackTrace!=null){ StringBuilder输出=新的StringBuilder(); 用于(对象行:stackTrace){ 输出。追加(行); 输出.追加(行尾); } 返回output.toString(); }否则{ 返回“[堆栈不可用]”; } }
使用。日志可以嵌入到标准调度服务中,如下面的示例所示,我从gwt调度页面中提取了该示例

公共类SimpleDispatchServlet扩展了RemoteServiceServlet
实现StandardDispatchService{
私人派遣;
公共SimpleDispatchServlet(){
InstanceActionHandlerRegistry注册表=
新建DefaultActionHandlerRegistry();
addHandler(新的IncrementCounterHandler());
dispatch=新的SimpleDispatch(注册表);
}
公共结果执行(操作操作)引发DispatchException{
试一试{
返回分派。执行(操作);
}捕获(运行时异常e){
日志(“执行“+action.getClass().getName()时出现异常”)
+“:”+e.getMessage(),e);
投掷e;
}
}
}

首先,我需要服务层的服务器端日志。关于您的建议,我不清楚。你能解释一下吗?据我所知,您将异常包装在响应对象中,是这样构建的吗?服务器端的所有异常都应该已经由您选择的日志(或sysout)记录。我们决定以一种特殊的方式处理一些异常,并让客户机向用户提供有用的信息。例如验证错误。gwt在默认情况下确实会包装这些错误,但您可以在代码中轻松更改它们。我还没有尝试过,但它似乎是正确的解决方案。一旦我有了与日志记录相关的任务,我就会尝试它。直到那时,我才认为它是正确的。
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;
        }
    }
}