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

Ril*_*ark 8 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
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我将这个问题保持开放 - 我仍然有兴趣从EntityProxyId中获取持久性id.

Bob*_*obV 9

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

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

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

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));
  }
});
Run Code Online (Sandbox Code Playgroud)

在上面的演示中,一旦有了persistedString,您可以将值存储在cookie或其他一些客户端持久性机制中,稍后重新创建id以用于调用RequestFactory.find().第二和第三个断言证明了短暂身份的"范围".短暂和持久的形式可以与RequestFactory创建对象的形式互换使用.如果一个短暂的id与一个新创建的a实例一起使用RequestFactory(如果一个短暂的id被标记为一个History令牌就会发生),你会得到一个EntityProxyId,但它不能真正用于任何有用的目的.


Hil*_*amp 1

实现 an 的类EntityProxyIdSimpleEntityProxyId. 这个类有一个方法getServerId(),它将返回 id。因此,通过检查instanceof您就可以调用该方法。(实际上RequestFactory.getHistoryToken()甚至不检查,只是简单地转换为此类)。

现在是坏消息:它已被编码,并且 的基类SimpleEntityProxyId(它是SimpleProxyId并包含方法 )getServerId()具体指出:

编码后的地址对于客户端来说是完全不透明的。它可能是一个 base64 编码的字符串,但也可能是 pi 的数字。除了将此字段的内容发送回服务器之外的任何代码都是错误的。

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