阐明 GWT RequestFactory 和 RequestContext 的工作原理

2024-04-30

我正在尝试将 RequestFactory 和编辑器框架实现到我的应用程序中。即使在研究了论坛、Google 开发者论坛和其他论坛之后,我仍然发现,关于将 RequestContext 与 RequestFactory 一起使用,我仍然不明白一些基本的东西。这是我的场景:
我有一个简单的实体,它具有三个字段,id、版本、描述,称为 CmsObjectType。我有一个相应的 EntityProxy 和一个带有 CRUD 操作的 CmsObjectTypeServiceDAO。我还实现了 ServiceLocator 和 ObjectLocator 类。这段代码全部编译并运行。

我还使用以下命令创建了一个简单的测试用例来测试 CRUD 操作:

public class RequestFactoryProvider {

public static CmsRequestFactory get() {
    SimpleEventBus eventBus = new SimpleEventBus();
    CmsRequestFactory requestFactory = RequestFactoryMagic.create(CmsRequestFactory.class);
    ServiceLayer serviceLayer = ServiceLayer.create();

    SimpleRequestProcessor processor = new SimpleRequestProcessor(
            serviceLayer);
    requestFactory.initialize(eventBus, new InProcessRequestTransport(
            processor));
    return requestFactory;
}

}

考试:

public class TestCmsObjectTypeRequest extends Assert {

private static CmsRequestFactory requestFactory;
private static CmsObjectTypeRequestContext objectTypeRequest;
private Long newId;

@Before
public void setUp() {
    requestFactory = RequestFactoryProvider.get();
    objectTypeRequest = requestFactory.objectTypeRequest();
}

    @Test
public void testEdit() {
    final CmsObjectTypeProxy newType = objectTypeRequest
            .create(CmsObjectTypeProxy.class);
    newType.setDescription("NEW TYPE");
    objectTypeRequest.persist(newType).to(new Receiver<Long>() {

        @Override
        public void onSuccess(Long response) {
            if (response != null) {
                newId = response;
                assertTrue(true);
            } else {
                fail();
            }
        }

        @Override
        public void onFailure(ServerFailure error) {
            fail();
        }
    });

    // Edit the newly created object
    newType.setDescription("EDITED NEW TYPE");

        objectTypeRequest.update(newType).to(new Receiver<Boolean>() {

            @Override
            public void onSuccess(Boolean response) {
                assertTrue(response);
            }

            @Override
            public void onFailure(ServerFailure error) {
                fail();
            }
        });

        //Remove it when we're done..
        objectTypeRequest.delete(newType).to(new Receiver<Boolean>() {

        @Override
        public void onSuccess(Boolean response) {
            System.out.println("onSuccess from delete.");
            assertTrue(response);
        }

        @Override
        public void onFailure(ServerFailure error) {
            fail();
        }
    });
    objectTypeRequest.fire();
}
}

当我创建一个新的请求上下文并链接创建、更新和删除的方法调用,然后调用 fire() 时,它在上面的测试中没有任何问题。但是,如果我尝试通过调用该方法然后调用 fire() 来单独执行这些调用,我会遇到问题。我可以调用 create() ,让接收者返回新创建的实体的 id,然后使用该 id 调用 find(id) 并取回新创建的实体。到目前为止一切正常。然而,这就是我感到困惑的地方..如果我尝试从 find(id) 的接收器的 onSuccess() 方法中使用当前的 RequestContext 调用编辑,我会收到一条错误消息,指出上下文已经在进行中。如果我为 findProxy 创建一个局部变量,然后尝试使用 RequestContext 的新实例在新找到的实体上调用 requestContext.edit(foundProxy) ,然后调用 update() ,我会收到服务器错误,最常见的是:服务器错误:请求的实体在服务器上不可用。如果我不创建请求上下文的新实例,我会收到一个 IllegalStateException ,表示请求已在进行中。 这是示例测试,希望能让这一点更清楚:

@Test
public void testEditWOChaining() {
    final CmsObjectTypeProxy newType = objectTypeRequest
            .create(CmsObjectTypeProxy.class);
    newType.setDescription("NEW TYPE");
    objectTypeRequest.persist(newType).to(new Receiver<Long>() {

        @Override
        public void onSuccess(Long response) {
            if (response != null) {
                setNewId(response);
                assertTrue(true);
            } else {
                fail();
            }
        }

        @Override
        public void onFailure(ServerFailure error) {
            fail();
        }
    }).fire();

    if (newId != null) {
        objectTypeRequest = requestFactory.objectTypeRequest();
        objectTypeRequest.find(newId)
                .to(new Receiver<CmsObjectTypeProxy>() {

                    @Override
                    public void onSuccess(CmsObjectTypeProxy response) {
                        if (response != null) {
                            foundProxy = response;
                        }
                    }

                    @Override
                    public void onFailure(ServerFailure error) {
                        fail();
                    }
                }).fire();
    }

    if (foundProxy != null) {
        // Edit the newly created object
        objectTypeRequest = requestFactory.objectTypeRequest();
        CmsObjectTypeProxy editableProxy = objectTypeRequest
                .edit(foundProxy);
        editableProxy.setDescription("EDITED NEW TYPE");

        objectTypeRequest.update(editableProxy).to(new Receiver<Boolean>() {

            @Override
            public void onSuccess(Boolean response) {
                assertTrue(response);
            }

            @Override
            public void onFailure(ServerFailure error) {
                fail();
            }
        }).fire();
    }

    // Remove it when we're done..
    objectTypeRequest.delete(foundProxy).to(new Receiver<Boolean>() {

        @Override
        public void onSuccess(Boolean response) {
            System.out.println("onSuccess from delete.");
            assertTrue(response);
        }

        @Override
        public void onFailure(ServerFailure error) {
            fail();
        }
    });
    objectTypeRequest.fire();
}

这是我的问题.. 如果编辑不与 create() 关联而是与 find() 关联,那么处理编辑的最佳方法是什么?如果我尝试将查找与更新链接起来,我的foundProxy 为空并且内容不会更新。代理是否必须与创建它们的上下文保持绑定才能对其执行更新?如果有人可以解释这是如何工作的或向我指出一些文件来指出我所缺少的内容,我将不胜感激。这是否可能与测试框架处理请求的方式有关? 我已阅读以下内容,因此如果我错过了其中的某些内容,请告诉我:tbroyer 的精彩描述 http://tbroyer.posterous.com/gwt-211-requestfactory

谷歌文档 http://code.google.com/webtoolkit/doc/latest/DevGuideRequestFactory.html任何帮助将不胜感激。谢谢你!


看看RequestFactoryTest http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.javaGWT 源代码中的示例。这testChangedEdit() http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTest.java#292方法与您尝试编写的方法类似。它调用一个find()方法,然后对返回的代理进行操作onSuccess() method.

A RequestContext不是一个长期存在的对象。仅从被调用时起至您调用时有效fire()在上面。仅当满足以下条件时才可重复使用onFailure() or onViolation()方法被调用在你的Receiver.

An EntityProxy or ValueProxy通过返回Receiver.onSuccess()表示服务器数据的快照。因此,代理是不可变的,除非它与RequestContext通过致电edit()。返回的代理RequestContext.create()是可变的。可变代理始终与一个确切的代理相关联RequestContext这是一个错误“渡过溪流 http://www.youtube.com/watch?v=jyaLZHiJJnE”这不是一个错误re-edit()可变代理。

它以这种方式工作的原因是允许 RequestFactory 客户端仅将增量发送到服务器。通过调用域对象的find()方法(或使用Locator)。 RequestContext 本质上是一个累加器proxy.setFoo()呼叫和一个或多个Request / InstanceRequest调用。

一般准则:

  • 不要将 RequestContext 实例存储在生命周期超过生命周期的对象的字段中fire()方法调用。
  • 同样,可编辑EntityProxy or ValueProxy不应在调用之外保留实例fire().
  • The EntityProxyId从返回EntityProxy.stableId() can即使是新创建的代理,也可以无限期保留。这stableId对象适合用作 keyMap对象并具有稳定的对象标识语义(即具有不同版本的同一服务器域对象的两个快照将返回相同的“EntityProxyId”)。
  • 实例RequestFactory应构建一次并在模块的整个生命周期内保留,因为它们的构建成本不菲。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阐明 GWT RequestFactory 和 RequestContext 的工作原理 的相关文章

  • 如何清除gwt中的缓存?

    我怎样才能清除缓存gwt 或者有什么方法可以阻止浏览器保留缓存gwt 当您部署 GWT 应用程序时 避免代理和浏览器缓存 GWT 生成的 nocache js 文件非常重要 一种解决方案是实现一个 Servlet 过滤器 添加控制缓存行为的
  • 如何使用 GWT 检测操作系统?

    Basically what I want to know is to find out if my GWT application is running on a MacOS or any other operating system t
  • GWT 和 Guava 的问题

    我很难让 GWT 与 Guava 一起工作 我添加了guava r09 gwt jar到我的类路径 并且
  • 是否有一个“AcceptsOneWidget”也“ProvidesResze”(除了“ScrollPanel”)?

    我有一个复合材料可以扩展ResizeComposite并有一个DockLayoutPanel作为它的根 我可以直接贴进去RootLayoutPanel它之所以有效是因为DockLayoutPanel ProvidesResize 但是 我想
  • GWT:将自定义小部件添加到单元格丢失自定义小部件的事件

    我们的要求是使用以下命令制作一个可编辑的网格CellTable在其单元格中包含自定义小部件 自定义小部件具有文本框和与文本框关联的搜索按钮 要将自定义小部件添加为单元格 请创建以下子类AbstractEditableCell类 由 GWT
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • GWT 哪个更好?

    在 GWT 接口中 使用带有 javacode 的普通 MVP 或 UiBinder 哪个更好 从性能 编辑 简单性方面 这是什么谷歌说 http code google com webtoolkit doc latest DevGuide
  • 阻止 GWT 中的事件冒泡

    我有以下代码片段 changeTextArea 是一个 TextArea 对象 changeTextArea addKeyboardListener new KeyboardListenerAdapter public void onKey
  • AttachEvent 是什么

    我真的不明白 AttachEvent 类或 addAttachHandler 是什么 这有什么用呢 有人可以为此发布一个例子吗 多谢 AttachEvent 会在 Widget 附加到实际页面或从实际页面分离时通知您 如果某个东西没有附加
  • 如何将 GWT 与 Visual Studio 一起使用来创建 ASP.NET 网站?

    如何将 GWT 与 Visual Studio 一起使用来创建 ASP NET 网站 如果可能 GWT 可以与任何后端一起使用 只需做一些工作 它开箱即用 使用 servlet 容器 但您不需要保留此容器 容器中的关键项是加载GWT编译代码
  • 禁用任何类型的浏览器窗口滚动?

    有没有办法禁用滚动 不仅仅是滚动条 还有浏览器窗口的全部功能 根据您对 Keit 的回答 您不想在打开灯箱时滚动处于活动状态 如果是这种情况 您可以使用以下 css 在打开灯箱的同时向正文添加一个类 这个解决方案的好处是它保留了滚动 空间
  • GWT 检测 GAE 版本更改并重新加载

    我的用户平均每次使用我的 GWT 应用程序 40 分钟 因此当我升级 GAE 后端的版本号时 他们在浏览器中运行的版本有很长一段时间与版本不匹配在服务器上支持它 大多数功能都被破坏 抛出不兼容的 RemoteServiceException
  • GWT CellTable getRowElement 抛出 IndexOutOfBoundsException

    我在 GWT 中使用 CellTable 并尝试在发生某些事件时向行添加样式 添加样式的代码如下 Range range playlistTable getVisibleRange int start range getStart for
  • 如何在不使用反射的情况下查看对象是否是数组?

    在Java中如何在不使用反射的情况下查看对象是否是数组 如何在不使用反射的情况下迭代所有项目 我使用 Google GWT 所以不允许我使用反射 我很想在不使用反射的情况下实现以下方法 private boolean isArray fin
  • 如何自动将 gwt.codesvr 附加到页面 URL

    在托管模式下运行 GWT 应用程序时 通常需要在查询字符串参数中添加代码服务器的位置 例如 而不是index html可能需要打开index html gwt codesvr 127 0 0 1 9997 问题是gwt codesvr通常不
  • GWT 有自己的类路径概念吗?

    GWT 编译器是否有自己的 类路径 概念 与正常的编译时类路径分开 GWT 应用程序 及其内部工作方式 是否具有与普通 JRE 运行时类路径分开的自己的类路径的概念 GWT 有模块的概念 每个模块都会声明其源路径中有哪些包 模块可以扩展其他
  • JsInterop“com 未定义”

    尝试使用 JsInterop 与每个 Javascript 的 LibGDX 项目进行通信 我正在关注 将 Java 类型导出到 JavaScript 示例here http www gwtproject org doc latest De
  • GWT - onClick 未触发

    我在表单上有一个非常奇怪的行为 有许多具有内联验证的文本字段 如果内容无效 则会在字段下方显示错误消息 验证在模糊时触发 页面底部有一个 下一步 按钮 单击后 将执行验证 如果一切正常 则提交表单 现在 如果当我单击按钮时强制空白字段具有焦
  • 调整 Horizo​​ntalPanel 单元格的大小

    新手警报 我一直在疯狂地寻找一种方法来调整 Horizo ntalPanel 的特定单元格的大小 我想做的是实现一个 2 单元格水平面板并将左侧单元格设置为 200px 但是 我试图让正确的单元格填充窗口的其余部分 而不是其单元格内容 只见
  • gwt 文本框添加更改处理程序

    我有一个从设计师那里收到的文本框 但是我在 GWT 中编写了操作 问题是文本框为空 但是当通过按下按钮用值填充文本框时 将显示警报框 通知值已更改 但没有成功 帮助我 TextBox zip1 null function onModuleL

随机推荐

  • 如何将字段从主报表传递到表格元素?

    到目前为止 我使用列标题和详细信息带来生成表格 现在我想使用iReport 4 0 2 中的表格元素 我这样尝试过 iReport 将参数从主报表查询传递到表或列表的数据集查询 https stackoverflow com questio
  • 如何制作Applicative的固定长度向量实例?

    最近了解了推广 决定尝试写向量 LANGUAGE DataKinds GADTs KindSignatures module Vector where data Nat Next Nat Zero data Vector Nat gt gt
  • Python 中的字符串、整数和运算符

    如何在运算中使用算术运算符 由用户作为字符串输入 我可以打印操作本身 但我想打印解决方案 这是我的笨拙尝试 Initialise variables x 2 y 3 Prompt the user for an arithmetic ope
  • Python 在打开套接字时可以选择哪个网络适配器吗?

    运行 python 应用程序的目标计算机将具有三个可用的网络接口 一般来说 所有三个网络都会有很大不同 但是三个网络中的两个可能位于相似的网络上 在下面的示例中 我无法控制 ETH 2 上的目标地址 因为它是预先配置的系统 因此我被迫以编程
  • 如何取消js文件的压缩?

    如何取消通过 webpack 工具缩小的 js 文件 缩小之前 function autoslideSlider next slide trigger click window on load function preloader fade
  • 使用不正确的凭据登录时,Jquery Mobile Rails & Devise 加载页面时出错

    我正在掌握 Rails 3 的窍门 并制作了几个可用的应用程序 我是在 Rails 中使用 javascript 或 jquery 的新手 我有一个使用 Rails 3 2 devise 和 cancan 的工作应用程序 然后我将其转换为使
  • npm - EPERM:Windows 上不允许操作

    I ran npm config set prefix usr local 运行该命令后 当尝试在 Windows 操作系统上运行任何 npm 命令时 我不断收到以下信息 Error EPERM operation not permitte
  • 实体框架,高效的NavigationProperty.OfType查询

    我在使用每表类型 TPT 继承在 EF4 中构造有效查询时遇到问题 我有一个名为Episode 并且每个情节可以有多个事件 有几种不同类型的事件都源自称为Event 我想过滤不包含特定类型事件的所有剧集 Episode有一个导航属性 它是其
  • 用于 C# 和 iPhone 应用程序的 MongoDB

    我正处于设计应用程序的初始阶段 该应用程序将具有用 C 实现的后端 该后端将使用 IIS 上托管的 WCF Web 服务为其他平台提供数据 iPhone 就是其中之一 由于是个人项目 所以想用它来学习MongoDB 我已经知道有社区开发的
  • Android:将视图放置在任意位置

    我一直在尝试将视图放置在任意位置 My aim 覆盖 JPG PNG 的某个矩形 给定坐标与 JPG PNG 相关的 还有一些其他视图 例如图库或一些视频 我不想使用绝对布局 因为它已被弃用 因此 我使用relativelayout 定义一
  • CSS 精灵和 IE6

    IE6 支持 CSS 精灵吗 是的 IE 6 支持精灵 但不支持 24 位 PNG 透明度 我使用这个 css hack 为 IE background image url images sprites icons sprite png b
  • 使用 T-SQL FOR XML PATH 删除空 XML 节点

    我在用着FOR XML PATH从 SQL Server 2008R2 中的表构造 XML XML 必须按如下方式构建
  • 设备重启后 UNUserNotificationCenter 通知

    我一直在网上搜索 看看您安排的通知是否会在设备重新启动后被删除 我发现了不同的意见 所以我开始测试它 这是我注意到的 我安排了 10 分钟后的通知 重新启动手机 没有任何反应 但是 昨天我安排了很多通知 其中一些是当天的 尽管从昨天开始我已
  • 如何在 Web 视图中向下滚动时隐藏 ActionBar/Toolbar

    在 Google Chrome 和 Play 商店中 该应用程序可以在滚动时隐藏操作栏 并允许用户方便地浏览 请帮助我这样做 我已经将 onTouchListener 用于 webview 但它不起作用 mWebView setOnTouc
  • 同一节点的碰撞检测和重叠检测? [第2部分]

    的延续上一个问题 https stackoverflow com questions 71608423 collision detection and overlapping detection in same node 71622366
  • 更改表以给出外键约束

    我有一个表 其中有 2 列 是从两个不同的表复制的 我现在要做的是对列名 email 和 id 给出外键约束 如下所示 ALTER TABLE users role map ADD CONSTRAINT FK users role map
  • Rhino JavaScript 引擎是否有适用于 .NET 的端口

    我在一家同时拥有 Java 和 NET 实现应用程序的公司工作 该应用程序允许最终用户使用脚本自定义处理和业务规则 Java 版本支持 JavaScript 使用犀牛发动机 http www mozilla org rhino NET 应用
  • WebView获取最大滚动宽度

    大家好 我正在创建 epub 阅读器并在 android webview 中加载这本书 并且还使 webview 水平移动参考this https stackoverflow com questions 36617345 use horiz
  • PHP 4 中的匿名函数(lambda、闭包)

    PHP 4 中是否有一个技巧来实现返回函数的函数 我预计以下代码可以工作 function xxx a return function b print a a b b n f1 xxx 1 f1 2 不幸的是 在 PHP 4 中没有运气 也
  • 阐明 GWT RequestFactory 和 RequestContext 的工作原理

    我正在尝试将 RequestFactory 和编辑器框架实现到我的应用程序中 即使在研究了论坛 Google 开发者论坛和其他论坛之后 我仍然发现 关于将 RequestContext 与 RequestFactory 一起使用 我仍然不明