1

尝试使用 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());
}

任何帮助将不胜感激,我将尝试发布任何经验教训。

4

2 回答 2

2

这段代码:

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

方法:

  1. 创建新的orgRequestContext()
  2. IOrgProxy使用此上下文创建新的
  3. 使用这个上下文编辑IOrgProxy的,因为正如文档所说:“返回一个新的可变代理,这个请求可以携带到服务器,也许是持久化的。”,这意味着这个请求编辑了代理。

这段代码:

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

方法:

  1. 同样,创建新orgRequestContext()的(因为每次调用都getRequestFactory().orgRequestContext()提供了的实例orgRequestContext()

  2. “开始用数据驱动编辑器及其子编辑器。” 正如文档所说。但作为其中的一部分,使用传递orgRequestContext()来编辑传递IOrgProxy的实例,以便代理是可编辑的。

  3. 因为代理在被其他RequestContext创建时已经被编辑过,所以你会得到例外,因为RequestFactory中有一个基本规则,该代理只能由一个RequestContext编辑。

    另请参阅此线程

于 2012-10-18T07:10:56.533 回答
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 );
}
于 2012-10-18T07:10:12.880 回答