如何在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方法和正确的异常。为此,您需要遵循其指导原则,即:
- 您需要在服务中指定 异常可以被删除的签名 扔
- 必须抛出异常 在服务实现方法中
com.google.gwt.user.server.rpc.RPC
但这是非常高级的东西。有关GWT RPC处理异常的信息,请参阅
“预期失败”是由在服务方法签名中声明的服务方法引发的异常。这些异常被序列化回客户端
“意外预期”是指不属于服务方法签名的错误,或由SecurityExceptions、SerializationExceptions或RPC框架内的其他故障导致的错误
您需要的是一个选中的异常,因为您希望将其发送回客户机并对其进行处理。RPC框架负责捕获它,序列化它,并调用onFailure方法和正确的异常。为此,您需要遵循其指导原则,即:
- 您需要在服务中指定 异常可以被删除的签名 扔
- 必须抛出异常 在服务实现方法中
com.google.gwt.user.server.rpc.RPC
但这是相当先进的东西。如果你想,你必须使用。RuntimeException是未经检查的异常,因此在这种情况下不能使用它
创建自己的异常,该异常扩展异常并实现可序列化。另外,您必须在方法声明中指出此方法可能引发异常:如果您想,您必须使用。RuntimeException是未经检查的异常,因此在这种情况下不能使用它
创建自己的异常,该异常扩展异常并实现可序列化。另外,您必须在方法声明中指出此方法可能引发异常:@Mark,您问了类似的问题:。已经回答了,您不应该对不同的用户提出相同的问题。@Mark,您提出了类似的问题:。它已经被回答,你不应该问同一个问题与不同的用户..谢谢你的回答。这就是我想要做的,但是我已经有了这么多的服务方法,很难修改它们来调用validate会话方法。我希望在方法调用之前有一种更简单的方法来集中会话验证。谢谢您的回复。这就是我想要做的,但是我已经有了这么多的服务方法,很难修改它们来调用validate会话方法。我希望在方法调用之前有一种更简单的方法来集中会话验证,但事实并非如此。您可以使用
RuntimeException
,但必须在服务接口(非异步)和实现中声明它。看见