3

在我的一个项目中,我有一个 GWTEntityProxy简化如下:

@ProxyFor(value = Item.class, locator = ItemService.class)
public interface ItemProxy extends EntityProxy
{
    String getName();

    // other getters and setters here
}

具有相应的实体实现,它是一个简单的 JPA 注释实体 bean。

我还有一个请求上下文:

@Service(value = ItemService.class, locator = InjectingServiceLocator.class)
public interface ItemRequestContext extends RequestContext
{
    Request<List<ItemProxy>> findItems();
}

以及相应的服务和定位器实现:

public class ItemService extends Locator<Item, Long>
{
    @Override
    public Item find(Class<? extends Item> clazz, Long id)
    {
        return getItemFromJpa(id);
    }

    public List<Item> findItems()
    {
        return getAllItemsFromJpa();
    }

    // Remaining Locator and JPA methods skipped
}

当我findItems从 RPC 角度调用 GWT 请求上下文中的方法时,一切似乎都按预期工作,并且我在回调方法中获得了项目列表以在客户端中使用。

但是从持久性的角度来看,实现并没有按预期工作:在服务器端,该方法findItems按预期调用,从持久性中获取我的项目并返回它们。然后对于每个项目,find使用项目的 id 调用该方法,当然,一个接一个地从持久性中再次检索项目。

是什么导致 GWT 请求工厂上下文进行这些无用的调用,我该如何防止它这样做?

4

1 回答 1

4

在返回浏览器之前,RequestFactory 会检查它看到的每一个域对象(无论是从请求中,还是在服务方法的返回值中),看它是否仍然存在,从而决定是否应该告诉客户端对象已被删除(EntityProxyChange使用 生成事件WriteOperation.DELETE)。

这个检查是通过调用定位器的isLive方法来完成的,该方法的默认实现find使用对象的 ID 调用并检查返回值是否为null.

换句话说,您可以简单地isLive在定位器中覆盖以提供您自己的逻辑,并可能绕过对持久层的调用。

于 2011-10-06T11:06:04.117 回答