StatusCodeException与Vs. GWT中的RuntimeException

时间:2011-06-06 07:00:27

标签: gwt

在我的GWT应用中。我重写了RemoteServiceServlet,以便在调用服务方法之前检查会话是否有效。我试图从服务器抛出一个RuntimeException(“过期的会话”),我希望客户端从asynccallback onFailure中捕获此异常......

在客户端我想: 的AsyncCallback:

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

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

    }

但是,在客户端中,捕获的对象仍然是StatusCodeException,并且消息仍然是默认的“...服务器中的异常...”。如果它是我从服务器发送的会话过期消息,我如何覆盖至少要比较的默认消息?

感谢

嗨Gursel, 这是我的代码: - >自定义RemoteServiceServlet。我试图在调用之前“拦截”每个方法。我检查会话并抛出一个RuntimeException,如果它已经过期了。所以基本上,抛出异常的声明方法不是自定义RemoteServiceServlet。它仍然转到客户端异步中的“onFailure”,但Throwable对象仍然是“StatusCodeException”类型,没有EXPIRED_SESSION_MSG消息。不要知道如何做这项工作。谢谢!

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

2 个答案:

答案 0 :(得分:5)

如果您没有在远程方法声明中声明它们,那么gwt应用程序的服务器端抛出的所有RuntimeExceptions都被包装为StatusCodeException

编辑:

之后,Thomas Broyer评论说,我了解到在远程方法声明中声明的所有异常(已检查或未检查)都会传播到gwt客户端。因此,您只需要声明远程方法,例如:

public void myRemoteMethod() throws RuntimeException;

答案 1 :(得分:0)

帖子看起来太旧了,这里仍然是我想出的解决方案。覆盖processCall(String payload)的{​​{1}},如果会话无效,请执行打击代码,然后调用RemoveServiceServlet

super.processCall(payload)

所有GWT服务都是servlet,因此GWT序列化自定义异常并以字符串形式发送给客户端,我们遵循相同的原则:)