GWT requestfactory:如何捕获我在服务器端Locator抛出的异常?

时间:2013-02-05 09:57:57

标签: gwt requestfactory

在客户端:

factory.find(proxyId).fire(new Receiver<P>()
{
    @Override
    public void onSuccess( P response )
    {
        proxy = response;
        ...
    }

    @Override
    public void onFailure( com.google.web.bindery.requestfactory.shared.ServerFailure error )
    {
        Window.alert( error.getMessage() );
    }
}

在服务器端我使用如下的定位器:

public class myLocator extends Locator<T, String>
{
    @Injector LocatorHook hook;

    @Override
    public T find( Class<? extends T> clazz, String id )
    {
        T result = ...;
        hook.run( result );
        return result;
    }

    ....
}

hook.run()方法可能会抛出RunTimeException("validation exception"),我希望能抓住它 onFailure()中客户端的异常,但我确实捕获了异常,但消息是“内部服务器错误”, 不是我在hook.run()投放的例外:“验证例外”

让客户端捕获我在服务器端抛出异常的任何想法?


更新用: 正如托马斯所说,验证来自数据存储的新鲜对象很奇怪,但我遇到了一个问题 我不知道如何使用服务方法的情况:  在客户端我获得EntityProxyId个对象,通过factory.find( proxyId ).fire(...)我可以获得该实体 从数据存储区,但实体可能不适合用户访问,在这种情况下我需要在服务器端检查它,但我找不到一个合适的地方来做 验证,有关此的任何想法?

1 个答案:

答案 0 :(得分:1)

RequestFactory不期望定位器抛出异常。异常只应由服务方法引发,并将定向到客户端的相应Receiver(附加到投掷的服务方法的那个)。

外部服务方法,唯一被路由到客户端的例外是ReportableException,只能从ServiceLocatorDecorator的{​​{1}}方法抛出。这意味着您可以挂钩自己的report()来捕获定位器和ServiceLocatorDecorator的异常。


也就是说,验证来自数据存储的新鲜对象似乎很奇怪。您可能希望提供覆盖report()的{​​{1}}(在应用来自客户端的更改后将验证对象)。错误将返回到ServiceLocatorDecorator的{​​{1}}中的客户端,而validate()解冻,以便您可以进一步编辑代理和{{ 1}}再次。