java - GWT RequestFactory 是否支持乐观并发控制的实现?

标签 java gwt requestfactory

在 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/

相关文章:

java - 如何在 Firebase 中保存位置信息

java - 使用应用程序 android 将图像上传到谷歌云存储

java - Sonar : Possible null pointer dereference due to return value of called method

java - 子节点被添加到 Gxt TreeGrid 中的不同树节点

java - GWT 持久 URL

javascript - 如何在java中使用PhantomJSDriver获取Alert对象?

gwt - 阐明对 Presenter 界面的理解

java - GWT 与 Solr 索引的接口(interface)

java - GWT - 相当于 "ServiceLayerDecorator.invoke(Method domainMethod, Object... args)"的 RPC

google-app-engine - 请求工厂 GWT 编辑器更改不会持久保留相关的 JDO 实体