GWT RequestFactory:如何从stableId()获取持久性id?

时间:2011-02-20 18:11:52

标签: gwt requestfactory

我在我的实体中使用Long ID,不仅要将它们存储在数据存储区中,还要引用其他实体。现在,我正在使用RequestFactory在客户端上创建()对象并保留它们,但我需要一种方法来确定服务器生成的id。

这是我认为需要两次旅行的一种方式:

final OrganizationProxy proxy = context.create(OrganizationProxy.class);
context.persist().using(proxy).fire(new Receiver<Void>(){

    public void onSuccess(Void response)
    {
        requestFactory.find(proxy.stableId()).fire(new Receiver<OrganizationProxy>()
        {
            public void onSuccess(OrganizationProxy response)
            {
                //hey, now response has the server-generated id in it, along with any other values the server populated
            }
        });
    }
});

但似乎必须是一种在没有第二次旅行的情况下获得持久ID的方法。似乎requestFactory.find()首先需要持久性id才能工作。

如何在没有第二次请求的情况下获取持久性ID?

=======更新=======

最终我(在tbroyer told me;)之后发生了我可以从RequestContext中的persist()方法返回Long id。这不会从EntityProxyId中检索持久性ID,但它确实在单个请求中获得了新对象的持久ID。

我会打开这个问题 - 我仍然有兴趣从EntityProxyId获取持久性ID。

3 个答案:

答案 0 :(得分:9)

您可以通过调用RequestFactory.getHistoryToken()获取EntityProxyId的字符串表示形式。这可以通过调用RequestFactory.getProxyId()转换回EntityProxyId

在RequestFactory的说法中,新创建的实体的id是“短暂的”。短暂ID仅在创建用于创建RequestFactory的{​​{1}}的{​​{1}}的实例中有效。当RequestContext被触发并且服务器已经处理了所有方法调用时,EntityProxy将检查有效负载的临时对象,如果它们已被持久化,则生成的有效负载将使用该值更新客户端的状态从RequestContext方法返回。

SimpleRequestProcessor在从短暂状态切换到持久状态时,对象标识和相等性会发生变化,但其关联的历史记录标记会发生变化:

getId()

在上面的演示中,一旦你有了EntityProxyId,就可以将值存储在cookie或其他一些客户端持久性机制中,然后重新创建id以用于调用{{1 }}。第二和第三个断言证明了短暂身份的“范围”。短暂和持久的表单可以与创建对象的OrganizationProxy proxy = context.create(OrganizationProxy.class); final EntityProxyId<?> id = proxy.stable(); String ephemeralString = factory.getHistoryToken(id); context.persist().using(proxy).fire(new Receiver<Void>() { public void onSuccess(Void response) { String persistedString = factory.getHistoryToken(id); assert !ephemeralString.equals(persistedString); assert factory.getProxyId(ephemeral) == factory.getProxyId(persistedString); MyRequestFactory otherFactory = GWT.create(MyRequestFactory.class); assert factory.getProxyId(ephemeral) != otherFactory.getProxyId(ephemeral); // Throws IllegalArgumentException otherFactory.find(otherFactory.getProxyId(ephemeral)); } }); 互换使用。如果短暂的id与新创建的persistedString实例一起使用(如果短暂的ID被标记为RequestFactory.find()令牌,则会发生这种情况),您将获得RequestFactory,但它不能真正用于任何有用的目的。

答案 1 :(得分:1)

实施EntityProxyId的班级是SimpleEntityProxyId。这个类有一个方法getServerId(),它将返回id。因此,通过使用instanceof进行检查,您可以调用该方法。 (实际上RequestFactory.getHistoryToken()甚至没有检查,只是简单地转换到这个类。)

现在是坏消息:它是编码的,SimpleEntityProxyId的基类是SimpleProxyId,包含方法getServerId(),具体说明:

  

encodedAddress对客户端完全不透明。它可能是base64编码的字符串,但它可能是pi的数字。除了将此字段的内容发送回服务器之外的任何其他代码都是错误的。

(字段encodedAddress包含服务器ID。)

答案 2 :(得分:1)

我刚刚在我的Proxy接口中声明了getId()方法,它似乎有效。这种方法有问题吗?