拦截GWT RPC的异步代理服务异常

拦截GWT RPC的异步代理服务异常,gwt,exception-handling,gwt-rpc,Gwt,Exception Handling,Gwt Rpc,我的应用程序有很多RPC调用,它们都有一个.onFailure(Throwable-catch)方法。我在客户端和服务器之间共享了一个类,代码为NotLoggeDineException。如果用户不具有基于会话/cookie/权限等的相关权限,则服务器会抛出此消息 理想情况下,我希望在将其他异常传递给.onFailure()代码之前,在一个位置处理此异常,因为这种处理非常普遍,并且出于安全考虑需要这样做。有一个GWT.setUncaughtExceptionHandler(),但它似乎是在处理后

我的应用程序有很多RPC调用,它们都有一个.onFailure(Throwable-catch)方法。我在客户端和服务器之间共享了一个类,代码为NotLoggeDineException。如果用户不具有基于会话/cookie/权限等的相关权限,则服务器会抛出此消息

理想情况下,我希望在将其他异常传递给.onFailure()代码之前,在一个位置处理此异常,因为这种处理非常普遍,并且出于安全考虑需要这样做。有一个GWT.setUncaughtExceptionHandler(),但它似乎是在处理后调用的,这并不理想(以防.onFailure意外消耗太多)

有人有一个优雅的解决方案吗?一个丑陋的解决方案是将延迟绑定的.create()代理封装在实现异步接口的同一聚合类中

旁注:服务器以前发出过重定向,但我不喜欢这种模式,我更希望它由应用程序的eventbus处理

更新:上面提到的丑陋答案


公共抽象类CustomAsyncCallback实现AsyncCallback{

@Override
public CustomAsyncCallback(AsyncCallback<T> callback)
{
    this.wrap = callback ;
}

AsyncCallback<T> wrap ;


@Override
public void onFailure(Throwable caught) {
    if (!handleException())
{
    wrap.onFailure(caught) ;
}
}

@Override
public void onSuccess(T t) {
    wrap.onSuccess(t) ;
}
@覆盖
公共CustomAsyncCallback(异步回调)
{
this.wrap=回调;
}
异步回调包装;
@凌驾
失败时的公共无效(可丢弃){
如果(!handleException())
{
包装失败(捕获);
}
}
@凌驾
成功时的公共无效(T){
包装成功(t);
}
}

公共类WrapDeferredBinding实现RpcInterfaceAsync { RpcInterface异步服务=GWT.create(RpcInterface.class)

public void方法1(int arg1,异步回调)
{
method1(arg1,新的CustomAsyncCallback(回调));
}
公开无效方法2。。。。
公开无效方法3。。。。

}

您可以使用抽象类包装
AsyncCallback
类:

public abstract class CustomAsyncCallback<T> implements AsyncCallback<T>{

    @Override
    public void onFailure(Throwable caught) {
        GWT.log(caught.getMessage());
        handleException();

        this.customOnFailure(yourDesireParam);
    }

    /**
     * this method is optional
     */
    public abstract void customOnFailure(Param yourDesireParam);
}
公共抽象类CustomAsyncCallback实现AsyncCallback{
@凌驾
失败时的公共无效(可丢弃){
GWT.log(catch.getMessage());
handleException();
此.customOnFailure(您的DesiredParam);
}
/**
*此方法是可选的
*/
公共摘要void customOnFailure(Param yourdireparam);
}

然后向RPC异步方法发送一个
CustomAsyncCallback
对象。

为了包装传递给任何
RemoteService
的每个
AsyncCallback
,您需要覆盖
RemoteServiceProxy\doCreateRequestCallback()
因为每个
AsynCallback
都是在RPC调用发生之前在这里提交的

以下是执行此操作的步骤: 首先,您需要定义自己的代理生成器,以便在每次生成
RemoteService
代理时介入。首先扩展
ServiceInterfaceProxyGenerator
并重写
#createProxyCreator()

/**
*此生成器扩展了默认GWT{@link ServiceInterfaceProxyGenerator},并在
*co.company.MyModule GWT模块,用于可分配给的所有类型
*{@link com.google.gwt.user.client.rpc.RemoteService}。它提供了
*{@link MyProxyCreator}。
*/
公共类MyServiceInterfaceProxyGenerator扩展ServiceInterfaceProxyGenerator{
@凌驾
受保护的ProxyCreator createProxyCreator(JClassType remoteService){
返回新的MyProxyCreator(remoteService);
}
}
MyModule.gwt.xml
中,只要gwt生成类型为
RemoteService
的内容,就使用延迟绑定来指示它使用代理生成器进行编译:


扩展
ProxyCreator
并覆盖
#getProxySupertype()
。在MyServiceInterfaceProxyGenerator#createProxyCreator()中使用它,以便为所有生成的
远程服务代理定义基类

/**
*此代理创建者扩展了默认GWT{@link ProxyCreator},并将{@link RemoteServiceProxy}替换为基类
*具有{@link MyRemoteServiceProxy}的代理数。
*/
公共类MyProxyCreator扩展了ProxyCreator{
公共MyProxyCreator(JClassType serviceIntf){
超级(serviceIntf);;
}
@凌驾

在问题中,我确实提到了包装延迟绑定类。它看起来与您的方法类似&需要一个CustomAsyncCallback,但对于使用AsyncCallback的所有情况,它都是透明的(见上文)。您的方法更有效,因为您不需要创建虚拟包装器实例,但它需要到处更改代码,如果我的团队意外地覆盖onFailure,它将eclipse CustomAsyncCallback(尽管可能是最终的)。理想情况下,我希望对com.google.gwt.user.rebind.rpc.ProxyCreator进行修改,但如果不熟悉,它看起来很毛茸茸的。:-)是的,这就是我一直在寻找的。关于如何使用生成器的一个例子就是我认为回答这个问题所需的内容。很多thanx。对我不起作用。我没有收到任何错误,但这些调用不会被拦截d:/i gwt再次编译了该项目,现在正在运行。
public abstract class CustomAsyncCallback<T> implements AsyncCallback<T>{

    @Override
    public void onFailure(Throwable caught) {
        GWT.log(caught.getMessage());
        handleException();

        this.customOnFailure(yourDesireParam);
    }

    /**
     * this method is optional
     */
    public abstract void customOnFailure(Param yourDesireParam);
}