GWT请求工厂和编辑器框架异常

时间:2012-10-17 23:59:32

标签: gwt requestfactory

当尝试使用RequestFactoryEditorDriver.edit()编辑新的(代理)实体时,我收到以下错误:“异常捕获:尝试编辑以前由另一个RequestContext编辑的EntityProxy”。我很确定这是因为我对请求工厂/编辑器框架架构的误解。以下是我认为与此问题有关的编辑器代码:

public class OrgMaintenanceWidget extends Composite implements Editor<IOrgProxy> {
... other fields ...
private IOrgEditorDriver _orgEditorDriver;
interface IOrgEditorDriver extends RequestFactoryEditorDriver<IOrgProxy, OrgMaintenanceWidget> {}
public OrgMaintenanceWidget(final IClientFactory clientFactory) {
  ... widget initialization ...
  _orgEditorDriver = GWT.create(IOrgEditorDriver.class);
  _orgEditorDriver.initialize(_clientFactory.getRequestFactory().getEventBus(),
                              _clientFactory.getRequestFactory(), this);
}
@UiHandler("newButton")
public void onNewButtonClick(final ClickEvent clickEvent) {
  _org = _clientFactory.getCache().getOrgCache().newOrg();
  _orgEditorDriver.edit(_org, _clientFactory.getRequestFactory().orgRequestContext());
}
...
}

导致异常的“_orgEditorDriver.edit()”行。 “newOrg()”方法是:

public IOrgProxy newOrg() {
  return _clientFactory.getRequestFactory().orgRequestContext().create(IOrgProxy.class);
}

RequestFactory就是:

public interface IRequestFactory extends RequestFactory {
IOrgRequestContext orgRequestContext();
}

我确信我遗漏了一些关于编辑新实体的基本知识。当我编辑现有实体时,一切都很好...... UI组件会自动填充,并且将编辑器刷回实体可以很好地工作。这是启动现有实体编辑的代码:

@UiHandler("newButton")
public void onNewButtonClick(final ClickEvent clickEvent) {
  _org = _clientFactory.getCache().getOrgCache().newOrg();
  _orgEditorDriver.edit(_org, _clientFactory.getRequestFactory().orgRequestContext());
}

我们将非常感谢任何帮助,并且我会尝试发布任何经验教训。

2 个答案:

答案 0 :(得分:2)

此代码:

_clientFactory.getRequestFactory().orgRequestContext().create(IOrgProxy.class);

意思是:

  1. 新建orgRequestContext()
  2. 使用此上下文
  3. 创建新的IOrgProxy 使用此上下文
  4. 修改IOrgProxy,因为docs说:“返回此请求可以携带的新可变代理服务器,可能是持久的。“,这意味着此请求已编辑代理。
  5. 此代码:

    _orgEditorDriver.edit(_org, _clientFactory.getRequestFactory().orgRequestContext());

    意思是:

    1. 再次创建新的orgRequestContext()(因为getRequestFactory().orgRequestContext()的每次调用都提供了 orgRequestContext()
    2. 的实例
    3. “开始使用数据驱动编辑器及其子编辑器。”正如文档所说。但作为其中的一部分,使用传递orgRequestContext()来编辑传递的IOrgProxy实例,以便代理可编辑。
    4. 由于代理已在其他 RequestContext创建时编辑,因此您获得异常,因为RequestFactory中有基本规则,该代理只能由一个RequestContext编辑。

      另见this thread

答案 1 :(得分:1)

我认为您无法使用一个RequestContext创建对象,然后使用另一个对象进行编辑。 所以你可以用两种方式解决这个问题:

  • 使用您在创建对象时使用的RequestContext保留创建的对象。 save方法应返回持久化对象,并且可以使用全新的RequestContext
  • 将此持久化对象传递给编辑器
  • 某处保存您用于创建对象的RequestContext并将其传递给edit
  • Driver函数

解决方案二看起来像这样:

@UiHandler("newButton")
public void onNewButtonClick(final ClickEvent clickEvent) {
  IOrgRequestContext ctx = _clientFactory.getRequestFactory().orgRequestContext();
  _org = ctx.create(IOrgProxy.class);
  _orgEditorDriver.edit(_org,ctx );
}