【问题标题】:How to prevent redundant persistence calls from GWT RequestFactory context?如何防止来自 GWT RequestFactory 上下文的冗余持久性调用?
【发布时间】:2011-10-06 01:27:20
【问题描述】:

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

@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
}

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

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

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

【问题讨论】:

    标签: java gwt requestfactory requestcontext


    【解决方案1】:

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

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

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

    【讨论】:

    • 对于从客户端发送到服务器的实体对我来说听起来很合理,但对于刚刚从服务器查询要发送到客户端的实体来说是有问题的。我会尽快检查您的建议,但我会遇到我不想破坏实体保存的问题,所以我想我必须以某种方式区分传入和传出实体的检查。
    • 我从 GWT RequestFactory 文档中真正错过的是一个工作流文档,该文档针对请求执行的工作流有关哪些数据被传输到服务器,哪些定位器/服务方法以何种顺序调用,哪个然后将数据返回给客户端,并在客户端上抛出哪些事件。关于这一点,EntityProxys 和 ValueProxys 的不同处理方式将引起特别的兴趣。
    • 检查每个域对象的情况是您可以执行以下操作:ctx.getFoo("id"); ctx.deleteFoo("id"); ctx.fire(); 这会将 foo 返回给客户端,但也会返回 fire 删除事件。
    • ValueProxies 是 EntityProxies 的精简版本:总是有一个“合成 stableId”,没有版本(跳过版本检查),with() 不适用(所有属性总是被传输),以及 isLive。使用定位器,只会调用 create()。
    猜你喜欢
    • 2018-12-06
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    相关资源
    最近更新 更多