在 GWT 应用程序中,我呈现可由用户编辑的项目。加载和保存项目是通过使用 GWT 请求工厂来执行的。我现在想要实现的是,如果两个用户同时编辑一个项目,则首先保存的用户以乐观并发控制的方式获胜。这意味着当第二个用户保存他的更改时,请求工厂后端会识别出存储在后端的项目的版本或存在状态已更改,因为它已传输到客户端,并且请求工厂/后端会以某种方式阻止项目更新/已保存。
我尝试在用于保存项目的服务方法中实现此功能,但这不起作用,因为请求工厂会提交刚刚从后端检索到的项目并应用用户的更改,这意味着这些项目的版本是当前版本从后端来看,比较毫无意义。
我可以利用请求工厂处理中的任何钩子(Hook)来实现请求的行为吗?还有其他想法吗?或者我必须使用 GWT-RPC 来代替......
最佳答案
编号:http://code.google.com/p/google-web-toolkit/issues/detail?id=6046
直到建议的 API 实现为止(EntityLocator
,在注释 #1 中,但我不清楚如何从其序列化 形式重建版本信息),您必须以某种方式将版本发送回服务器。
正如我在问题中所说,这不能通过简单地在代理中提供版本属性并设置它来完成;但您可以添加另一个属性:获取它总是返回 null
(或类似的不存在值),以便在客户端将其设置为“true”的值“版本属性总是会产生更改,这保证了该值将作为“属性差异”的一部分发送到服务器;在服务器端,您可以在setter中处理事情(当RequestFactory应用“属性差异”并调用setter时,如果该值与“true”版本不同,则抛出异常)或在服务中处理事情方法(比较从客户端发送的版本——您可以从与客户端上映射的 getter 不同的 getter 获得该版本,因为该版本必须始终返回 null
——与该版本的“true”版本对象,如果不匹配则引发错误)。
类似于:
@ProxyFor(MyEntity.class)
interface MyEntityProxy extends EntityProxy {
String getServerVersion();
String getClientVersion();
void setClientVersion(String clientVersion);
…
}
@Entity
class MyEntity {
private String clientVersion;
@Version private String serverVersion;
public String getServerVersion() { return serverVersion; }
public String getClientVersion() { return null; }
public void setClientVersion(String clientVersion) {
this.clientVersion = clientVersion;
}
public void checkVersion() {
if (Objects.equal(serverVersion, clientVersion)) {
throw new OptimisticConcurrencyException();
}
}
}
请注意,我尚未对此进行测试,这只是纯粹的理论。
关于java - GWT RequestFactory 是否支持乐观并发控制的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7696764/