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

GWT/RequestFactory-响应的对象树未完全加载,尽管with()参数似乎正常,gwt,requestfactory,Gwt,Requestfactory,在使用GWT和请求工厂时,我遇到以下问题 我正在研究一个由不同实体组成的对象树,比如A引用B和C,C引用D 我有一个loadAs方法,它使用with注释(with(“B”、“C”、“C.D”))返回整个对象图。到目前为止,一切看起来都很好,我在客户机上加载了以下结构 A1 -> B1 -> C1 -> D1 A* (created on the client using context.create() ) -> B1 (same B1 that w

在使用GWT和请求工厂时,我遇到以下问题

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

我有一个loadAs方法,它使用with注释(
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)
现在,我在客户机上的请求上下文中创建以下内容

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)
我的persist方法如下所示:
请求persistAs(List)

我使用与loadAs完全相同的参数启动它(
使用(“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.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);
    }
    
    列表持久化(列表为){
    //坚持认为
    //确保As的对象图已加载
    //返回为;
    //仅调试-使用loadAs返回->客户端根本没有收到任何内容
    返回载荷(As);
    }
    
    • 我想(我担心)这可能是


      请先尝试
      edit()
      ing您的D1代理(以及B1,因为您正在使用它),然后再
      fire()
      the
      RequestContext

      我尝试了对D1和B1进行编辑()。不幸的是,我得到了相同的结果。我尝试了GWT 2.5,但仍然得到了相同的错误:-(应该在那里修复吗?正如您在问题跟踪程序中看到的,不,它在2.5 RC1中没有修复。考虑到修复它会有多困难(前几天我快速查看了它),它可能不会出现在2.5.0或2.5.1中。不过,解决方法适用于其他有此问题的人,因此您可能会面临不同的问题。是否可以制作一个简单的项目来复制此问题并将其发布到某个位置?(Google Groups for GWT,或在跟踪器中打开一个问题并将项目附加到那里)这将帮助我调试错误并在需要时修复RequestFactory。嗨,Thomas,给你:;如果有任何问题,请与我联系。THXPeter是
      D1
      根实体或它有父实体(用GAE术语)你能在我的整个应用程序中显示你的吗?我不使用父母…所以应该是你所考虑的根实体。这里是定位器(上帝……我不符合这里的格式化程序)。包com.typecase.todos.server.service;导入com.google.web.bindery.requestfactory.shared.ServiceLocator;公共类DAOServiceLocator实现ServiceLocator{public Object getInstance(class clazz){try{return clazz.newInstance();}catch(InstantiationException e){throw new RuntimeException(e);}catch(IllegalAccessException e){抛出新的运行时异常(e);}}