0

在客户端:

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(...)我可以从数据存储获取实体,但实体可能不适合用户访问,在这种情况下我需要在服务器端检查它,但我找不到合适的地方进行验证,对此有什么想法吗?

4

1 回答 1

1

RequestFactory 不希望定位器抛出异常。异常应该只由服务方法抛出,并将被定向到Receiver客户端的适当位置(附加到抛出的服务方法的那个)。

在服务方法之外,唯一路由到客户端的异常是ReportableExceptions,它只能从 aServiceLocatorDecoratorreport()方法中抛出。这意味着您可以使用自己的钩子ServiceLocatorDecorator来捕获定位器中的异常并将report()它们发送出去。


也就是说,验证来自数据存储的新鲜对象似乎很奇怪。您可能希望提供一个ServiceLocatorDecorator覆盖validate()(在应用来自客户端的更改后验证对象)。错误将返回到Receiver's中的客户端,onConstraintViolations并且'sRequestContext将被解冻,因此您可以进一步编辑您的代理并fire()再次。

于 2013-02-05T10:41:45.423 回答