当尝试使用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());
}
我们将非常感谢任何帮助,并且我会尝试发布任何经验教训。
答案 0 :(得分:2)
此代码:
_clientFactory.getRequestFactory().orgRequestContext().create(IOrgProxy.class);
意思是:
orgRequestContext()
IOrgProxy
使用此上下文IOrgProxy
,因为docs说:“返回此请求可以携带的新可变代理服务器,可能是持久的。“,这意味着此请求已编辑代理。此代码:
_orgEditorDriver.edit(_org, _clientFactory.getRequestFactory().orgRequestContext());
意思是:
orgRequestContext()
(因为getRequestFactory().orgRequestContext()
的每次调用都提供了新 orgRequestContext()
orgRequestContext()
来编辑传递的IOrgProxy
实例,以便代理可编辑。由于代理已在其他 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 );
}