【问题标题】:GWT RequestFactory: How can I get a persistent id from stableId()?GWT RequestFactory:如何从 stableId() 获取持久 id?
【发布时间】:2011-06-30 20:16:42
【问题描述】:

我在我的实体中使用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。

【问题讨论】:

    标签: gwt requestfactory


    【解决方案1】:

    我刚刚在代理接口中声明了 getId() 方法,它似乎可以工作。这种方法有什么问题吗?

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        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));
          }
        });
        

        在上面的演示中,一旦有了persistedString,就可以将值存储在cookie 或其他一些客户端持久性机制中,然后重新创建id 以用于调用RequestFactory.find()。第二个和第三个断言展示了一个临时 id 的“范围”。临时和持久形式可以与创建对象的RequestFactory 互换使用。如果一个临时 ID 与一个新创建的 RequestFactory 实例一起使用(如果一个临时 ID 被标记为 History 令牌,就会发生这种情况),你会得到一个 EntityProxyId,但它不能真的用于任何有用的目的。

        【讨论】:

        • 谢谢 - 拥有这样的特定断言列表真的很有帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多