阐明 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 计时器取消不起作用

    我正在尝试编写代码来使用 GET 和 GETQuery 区分单击和双击 我明白了here http jsfiddle net KpCwN 4 所以我将它翻译成 GWT 如下所示 我的应用程序不能有全局变量 所以我用元素属性来完成该部分 im
  • Spring security 已登录用户的重定向问题

    在使用我的基于 GWT 的 Web 应用程序实现 Spring Security 时 我找到 一切都按预期正常工作 除了以下事实 我打开了 login jsp 并给出了有效的用户登录凭据 提交后 成功重定向到主页 现在 当我在地址栏中编辑
  • 从 gwt 中的代码触发点击事件

    我在 gwt 中创建了一个自定义小部件 它扩展了复合材料 我正在其中使用焦点面板 对于 FocusPanel 我添加了 ClickHandler 然后我添加了键盘监听器 现在按 Enter 键 它应该触发单击事件 任何人都可以提供帮助吗 我
  • 正则表达式和 GWT

    我的问题是 在GWT中使用正则表达式有没有好的解决方案 例如 我对 String split regex 的使用不满意 GWT 将代码翻译为 JS 然后将正则表达式用作 JS 正则表达式 但我无法使用 Java Matcher 或 Java
  • 在 Java 中如何将类作为参数传递?

    有什么方法可以将类作为 Java 中的参数传递并从该类中触发一些方法吗 void main callClass that class void callClass classObject classObject somefunction o
  • 带下拉箭头的 GWT 文本框

    我想在文本框中有一个下拉箭头 在我的例子中实际上是 SuggestBox GMail 执行此操作是为了实现高级搜索功能 打开高级搜索对话框 要使该箭头显示在 TextBox 的右侧并可单击 正确的 GWT 布局是什么 看看 GMail 我发
  • 超级开发模式下的客户端 GWT 调试

    我正在使用 超级开发模式 Java 8 和 Eclipse Photon 在 Eclipse 中调试 GWT 我已在代码的客户端放置断点 但似乎没有一个断点触发 我正在阅读文档 但它似乎与 遗留开发模式 调试有关 http www gwtp
  • 从输入跳到 CellTable 中的输入

    我有一个 CellTable 其中包含一堆渲染到的单元格
  • 带有编辑器框架的 GWT 验证器

    有没有人意识到编辑器和 jsr 303 验证如何与 GWT 2 3 一起工作 未来 验证 API 已添加到 gwt sdk 但我无法使用编辑器框架验证实体 无论 我确实从来没有从客户端或服务器端抛出错误 这是一个代码片段 public cl
  • 运行 GWT 的“MobileWebApp”示例时出现“HTTP 错误:500 无领域”

    我正在尝试运行 GWT 2 4 示例应用程序 MobileWebApp 当我尝试通过 Eclipse 在开发模式下运行应用程序时 出现 500 No Realm 错误 我知道这是一个身份验证问题 我不熟悉 Google App Engine
  • 有没有办法在 Chrome 开发者工具中评估源映射中的变量?

    我正在 Chrome 中使用 SuperDevMode 调试 GWT 应用程序 它让我能够访问 devtools 中的 Java 源映射 我的问题是 当我调试代码时 我想评估一些变量 我的问题是 是否可以从源映射中评估变量 如果没有 是否可
  • gwt hibernate 程序中的异常

    我正在尝试制作一个简单的 GWT RPC Hibernate 程序 将用户添加到 MySQL 数据库 我正在使用 Eclipse EE 该应用程序已成功将用户添加到数据库 但在编译时引发异常 这是我的应用程序的例外情况和来源 例外 Exce
  • 是否有一个“AcceptsOneWidget”也“ProvidesResze”(除了“ScrollPanel”)?

    我有一个复合材料可以扩展ResizeComposite并有一个DockLayoutPanel作为它的根 我可以直接贴进去RootLayoutPanel它之所以有效是因为DockLayoutPanel ProvidesResize 但是 我想
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • GWT 哪个更好?

    在 GWT 接口中 使用带有 javacode 的普通 MVP 或 UiBinder 哪个更好 从性能 编辑 简单性方面 这是什么谷歌说 http code google com webtoolkit doc latest DevGuide
  • GWT/JAVA 未捕获的异常转义

    我的代码有问题 但似乎无法修复它 我想在提交按钮时将一些客户数据添加到 java GWT 中的数组列表中 我从中添加数据的表单 ok addClickHandler new ClickHandler public void onClick
  • 在 GWT 中使用 SVG

    我想知道是否可以在面板中包含 SVG 内容 或者在 GWT 中工作的任何内容 能够以编程方式向 SVG 添加更多内容 例如添加圆或曲线 并处理鼠标事件 这会是在 SVG 或 GWT 中 我尝试创建一个 HTML 对象 添加以下内容
  • GWT GIN 现场级注入

    我们正在评估 GWT 项目中使用 GIN 的情况 并通过构造函数参数进行典型注入 取得了良好的结果 我们遇到的困难是现场级注入 这些字段最终总是为空 有没有人有一个很好的例子来说明如何使用 GIN 正确实现字段级注入 Update 这是一些
  • 您是否对基于 GWT 的应用程序的客户端和服务器端使用单个项目或单独的项目?

    您的 GWT 项目设置如何 您是否有一个针对客户端的项目和针对服务器端的单独项目 您能分享一下您为 GWT 前端 Spring 后端系统组织项目的经验吗 我希望在这个项目中使用 Spring GWT Tomcat Hibernate 除非您
  • 在 Java/GWT 中解析用户时间输入

    解析用户在 GWT 中的文本字段中键入的时间的最佳方法是什么 默认时间格式要求用户完全按照区域设置指定的时间格式输入时间 我想要更加灵活 因为用户可以通过多种不同的方式输入时间 例如 8 8p 8pm 8 15pm 13 15 1315 1

随机推荐

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

    到目前为止 我使用列标题和详细信息带来生成表格 现在我想使用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 一起使用 我仍然不明