Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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
如何在GWT RPC中触发onFailure?_Gwt - Fatal编程技术网

如何在GWT RPC中触发onFailure?

如何在GWT RPC中触发onFailure?,gwt,Gwt,可能重复: 如果会话在服务器中过期,我想触发RPC回调“onFailure”。 我创建了一个自定义RPC异步回调,用于处理来自服务器的“会话已过期”事件。 在调用方法之前,我重写RemoteServiceServlet以验证会话。因此,基本上,引发异常的不是声明的方法,而是定制的RemoteServiceServlet。它仍然会转到客户端异步中的“onFailure”,但Throwable对象的类型仍然是“StatusCodeException”,没有过期的会话消息。有什么想法吗 自定义Rem

可能重复:

如果会话在服务器中过期,我想触发RPC回调“onFailure”。 我创建了一个自定义RPC异步回调,用于处理来自服务器的“会话已过期”事件。 在调用方法之前,我重写RemoteServiceServlet以验证会话。因此,基本上,引发异常的不是声明的方法,而是定制的RemoteServiceServlet。它仍然会转到客户端异步中的“onFailure”,但Throwable对象的类型仍然是“StatusCodeException”,没有过期的会话消息。有什么想法吗

自定义RemoteServiceServlet:

public class XRemoteServiceServlet extends RemoteServiceServlet {
    private final static String EXPIRED_SESSION_MSG = "ERROR: Application has expired session.";   
    @Override
    protected void onAfterRequestDeserialized(RPCRequest rpcRequest) {
        HttpServletRequest httpServletRequest = this.getThreadLocalRequest();
        HttpSession session = httpServletRequest.getSession(false);
        if (session != null) {
            final String sessionIdFromRequestHeader = getSessionIdFromHeader();
            if (!isNullOrEmptyString(sessionIdFromRequestHeader)) {
                final String sessionId = session.getId();

                if (!sessionId.equals(sessionIdFromRequestHeader)) {
                    throw new RuntimeException(EXPIRED_SESSION_MSG);
                }
            }
自定义异步回调:

public class XAsyncCallback<T> implements AsyncCallback<T> {
    private final static String EXPIRED_SESSION_MSG = "ERROR: Application has expired session.";

    @Override
    public void onFailure(Throwable caught) {
        final String message = caught.getMessage();

        if (!isNullOrEmptyString(message) && message.contains(EXPIRED_SESSION_MSG)) {
            com.google.gwt.user.client.Window.Location.reload();
        }

    }

    @Override
    public void onSuccess(T arg0) {

    }

    /**
     * Returns true if the string is null or equals to the empty string.
     * 
     * @param string the string to test
     * @return true if the string is empty
     */
    private static boolean isNullOrEmptyString(String string) {
        return string == null || "".equals(string);
    }
}
公共类XAsyncCallback实现异步回调{
私有最终静态字符串已过期\u SESSION\u MSG=“错误:应用程序已过期会话。”;
@凌驾
失败时的公共无效(可丢弃){
最终字符串message=catch.getMessage();
如果(!isNullOrEmptyString(message)和&message.contains(EXPIRED\u SESSION\u MSG)){
com.google.gwt.user.client.Window.Location.reload();
}
}
@凌驾
成功时的公共无效(T arg0){
}
/**
*如果字符串为null或等于空字符串,则返回true。
* 
*@param string要测试的字符串
*@如果字符串为空,则返回true
*/
私有静态布尔值isNullOrEmptyString(字符串){
返回字符串==null | |“”.equals(字符串);
}
}
有关使用GWT RPC处理异常的信息,请参阅

“预期失败”是由在服务方法签名中声明的服务方法引发的异常。这些异常被序列化回客户端

“意外预期”是指不属于服务方法签名的错误,或由SecurityExceptions、SerializationExceptions或RPC框架内的其他故障导致的错误

您需要的是一个选中的异常,因为您希望将其发送回客户机并对其进行处理。RPC框架负责捕获它,序列化它,并调用onFailure方法和正确的异常。为此,您需要遵循其指导原则,即:

  • 您需要在服务中指定 异常可以被删除的签名 扔
  • 必须抛出异常 在服务实现方法中
您所做的是从一些甚至不应该抛出异常的方法中抛出一个未接受的异常。所以RPC不知道到底发生了什么,并发送回一条通用消息,说“嘿,发生了一些意想不到的事情,请查看服务器日志”

我知道你想在每次通话中检查会话。最简单的选择是在servlet实现中有一个方法来检查它,并从所有服务方法中调用它

否则,您可以通过查看类来尝试重写GWT RPC框架

com.google.gwt.user.server.rpc.RPC
但这是非常高级的东西。

有关GWT RPC处理异常的信息,请参阅

“预期失败”是由在服务方法签名中声明的服务方法引发的异常。这些异常被序列化回客户端

“意外预期”是指不属于服务方法签名的错误,或由SecurityExceptions、SerializationExceptions或RPC框架内的其他故障导致的错误

您需要的是一个选中的异常,因为您希望将其发送回客户机并对其进行处理。RPC框架负责捕获它,序列化它,并调用onFailure方法和正确的异常。为此,您需要遵循其指导原则,即:

  • 您需要在服务中指定 异常可以被删除的签名 扔
  • 必须抛出异常 在服务实现方法中
您所做的是从一些甚至不应该抛出异常的方法中抛出一个未接受的异常。所以RPC不知道到底发生了什么,并发送回一条通用消息,说“嘿,发生了一些意想不到的事情,请查看服务器日志”

我知道你想在每次通话中检查会话。最简单的选择是在servlet实现中有一个方法来检查它,并从所有服务方法中调用它

否则,您可以通过查看类来尝试重写GWT RPC框架

com.google.gwt.user.server.rpc.RPC
但这是相当先进的东西。

如果你想,你必须使用。RuntimeException是未经检查的异常,因此在这种情况下不能使用它

创建自己的异常,该异常扩展异常并实现可序列化。另外,您必须在方法声明中指出此方法可能引发异常:

如果您想,您必须使用。RuntimeException是未经检查的异常,因此在这种情况下不能使用它


创建自己的异常,该异常扩展异常并实现可序列化。另外,您必须在方法声明中指出此方法可能引发异常:

@Mark,您问了类似的问题:。已经回答了,您不应该对不同的用户提出相同的问题。@Mark,您提出了类似的问题:。它已经被回答,你不应该问同一个问题与不同的用户..谢谢你的回答。这就是我想要做的,但是我已经有了这么多的服务方法,很难修改它们来调用validate会话方法。我希望在方法调用之前有一种更简单的方法来集中会话验证。谢谢您的回复。这就是我想要做的,但是我已经有了这么多的服务方法,很难修改它们来调用validate会话方法。我希望在方法调用之前有一种更简单的方法来集中会话验证,但事实并非如此。您可以使用
RuntimeException
,但必须在服务接口(非异步)和实现中声明它。看见