【问题标题】:GWT RequestFactory not firing properly after using edit()使用 edit() 后 GWT RequestFactory 未正确触发
【发布时间】:2012-03-06 03:07:02
【问题描述】:

在使用 GWT RequestFactory 解冻和编辑代理后,我遇到了问题。

如果我有两个请求工厂对象及其关联的上下文,如下所示:

private SyntheticRequest req1 = requestFactory.someRequest(); 
private Request<xProxy> sendRequest1 = req1.something(); 

private SyntheticRequest req2 = requestFactory.someRequest(); 
private Request<xProxy> sendRequest2 = req2.something();

在第一个请求上使用“fire()”可以正常工作:

sendRequest1.fire(new Receiver<xProxy>() {
    @Override
    public void onSuccess(xProxy response) {
        ...
        if (somethingIsTrue){
               xProxy x = req2.edit(response);  //<-- **I think this causes a problem later, although the proxy "x" works as expected here.**
               x.setSomething("something"); 
               update();                
         }
});

那部分运行正常,因为我进入了“onSuccess”。但是当这个运行“update()”时,它看起来像这样:

private void update(){
  sendRequest2.fire(new Receiver<xProxy>(){
       ...onFailure...
       ...onSuccess...
  });
}

sendRequest2 总是失败,出现错误

服务器错误索引:0 大小:0

我在“something()”服务的代码中设置了一个断点,但它甚至都没有到达那个代码! “req2.edit()”一定有什么东西会伤害req2和sendRequest2,但是什么?

谢谢。

【问题讨论】:

    标签: google-app-engine gwt requestfactory


    【解决方案1】:

    什么是'b'? xProxy x = req2.edit(b); 这一行是第一次被提及吗?应该是xProxy x = req2.edit(response);

    无论如何..这不是问题.. “服务器错误”表示 RequestFactory 在服务器端处理请求期间捕获了异常。某些东西(但可能不是某些东西())正在引发 IndexOutOfBounds 异常。

    如果您查看 RequestFactoryServlet.java(您可以很容易地用您自己的替换),您可以看到它设置了一个 try catch 块,在处理请求时捕获所有异常。它将它们传递给“DefaultExceptionHandler”,后者将它们包装在 ServerFailure 中,然后作为 onFailure() 调用返回给您的 GWT 代码。

    找到抛出异常的简单方法是在 IndexOutOfBoundsException 上设置断点,确保捕获“捕获”的异常以及未捕获的异常。

    【讨论】:

    • 我已经更正了对“b”aidanok 的引用,你是对的,它应该是“响应”。谢谢,我会尝试你建议的断点。我怀疑当我执行 req2.edit(response) 时 req2 发生了一些事情,但我们会看到,我会报告回来。
    • 在新的或尚未触发的上下文中编辑响应代理不是问题,这将是正常流程。 “服务器错误:xxx”始终表示已捕获服务器端异常。
    • 谢谢!出现索引问题。由于 req2 是已编辑的未冻结代理,因此当上下文为 fire()'d 时,它还会通过代理的所有其他设置器,即使是我没有接触过的设置器,谁知道为什么。其中一名二传手遇到了在 fire() 期间出现的问题。任何想法为什么其他二传手在代理中使用? (在我的示例中,设置器不是“setSomething()”)。
    • 如果 getId() 或 getVersion() 为返回的代理返回 null,requestfactory 会将其视为未持久化,并发送整个对象,而不仅仅是更改。同样对于 ValueProxy 对象,它将始终发送整个对象,而不仅仅是更改。 (不过我猜它是一个 EntityProxy,因为你正在调用 update()..)
    • 谢谢aidanok。我的代理确实扩展了 ValueProxy(但只是因为向导把它给了我,而不是我的某些选择)。我确实有一个 getId 方法,但没有 getVersion。我不太了解这些细微差别,你能指出一个更好的地方来更好地理解吗?
    猜你喜欢
    • 2013-12-22
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多