GWT / RequestFactory - 尽管with()参数似乎正常,但响应的对象树未完全加载

时间:2012-03-30 10:19:43

标签: gwt requestfactory

使用GWT并请求出厂时,我遇到以下问题。

我正在研究一个由不同实体组成的对象树,例如A引用B和C,C引用D。

我有一个loadAs方法,它使用with annotations(with("B", "C", "C.D"))返回整个对象图。到目前为止,一切看起来都很棒,我在客户端上加载了以下结构。

A1
  -> B1
  -> C1
    -> D1

现在,我在客户端的请求上下文中创建以下内容。

A* (created on the client using context.create() )
  -> B1 (same B1 that was already loaded)
  -> C* (created on the client using context.create())
    -> D1 (same D1 that was already loaded)

我的持久化方法如下所示:Request<List<A>> persistAs(List<A>)

我使用与loadAs(with("B", "C", "C.D"))完全相同的带参数来激活它,但我的响应仍然如下:

A* (now contains an id that was created on the server)
  -> B1 (same as the previously loaded)
  -> C* (now contains an id that was created on the server)
      -> null

因此,客户端上已存在的D1不是响应对象树的一部分。但是,D1将发送到服务器,并在persistAs方法中作为请求对象树的一部分提供。此外,persistAs确保返回完整的对象树(包含D1)。

我不知道为什么会这样。我也不知道在哪里调试。我没有任何例外。

我在调试时注意到的其他信息或调查结果,并试图解决此问题:

  • 当我在持久化后在客户端上触发loadAs时,将返回完整的对象图
  • 我使用objectify作为持久性api
  • C是一种超自然的超类型,但它实现为一个普通实体,它的子类型也是如此,因为这个概念在其他任何地方都可以使用,我无法想象这就是问题所在。更确切地说:C始终是具体的子类型。然而,从C到D的引用直接在超类型C上,并且其所有子类型都被标记为实体代理并具有相应的服务器实体。
  • 出于测试目的,我修改了persistAs方法的服务器实现,以便在As持久化之后内部调用loadAs。但那时客户什么都没收到?!?有关说明,请参阅以下代码示例:

    List<A> persistAs(List<A> As) {
       //Persist the As
    
       // Make sure the object graph of the As is loaded
    
       // return As;
    
       // Debug only - return As using loadAs -> the client receives nothing at all
       return loadAs(As);
    }
    

1 个答案:

答案 0 :(得分:0)

我想(我担心)这可能是http://code.google.com/p/google-web-toolkit/issues/detail?id=7189

的奇怪后果

edit() fire() RequestContext之前,尝试{{1}}您的D1代理(以及B1也是如此)。