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.
您可以通过调用获取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
,但它不能真正用于任何有用的目的.
实现 an 的类EntityProxyId
是SimpleEntityProxyId
. 这个类有一个方法getServerId()
,它将返回 id。因此,通过检查instanceof
您就可以调用该方法。(实际上RequestFactory.getHistoryToken()
甚至不检查,只是简单地转换为此类)。
现在是坏消息:它已被编码,并且 的基类SimpleEntityProxyId
(它是SimpleProxyId
并包含方法 )getServerId()
具体指出:
编码后的地址对于客户端来说是完全不透明的。它可能是一个 base64 编码的字符串,但也可能是 pi 的数字。除了将此字段的内容发送回服务器之外的任何代码都是错误的。
(其中该字段encodedAddress
包含服务器 ID。)
归档时间: |
|
查看次数: |
3159 次 |
最近记录: |