【问题标题】:GWT Request Factory and Editor Framework ExceptionGWT 请求工厂和编辑器框架异常
【发布时间】:2012-10-17 23:59:31
【问题描述】:

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

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

【问题讨论】:

    标签: gwt requestfactory


    【解决方案1】:

    这段代码:

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

    意思:

    1. 新建orgRequestContext()
    2. 使用此上下文创建新的IOrgProxy
    3. 编辑新的IOrgProxy 使用这个上下文,因为docs 说:“返回一个新的可变代理,这个请求可以携带到服务器,也许是持久的。 ",表示该代理已被此请求编辑。

    这段代码:

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

    意思:

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

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

    3. 由于otherRequestContext创建时代理已经被编辑过,所以你会遇到异常,因为RequestFactory中有一个基本规则,该代理只能由一个RequestContext编辑。

      另见this thread。

    【讨论】:

    • 非常感谢彼得!这正是我需要理解的……这是对请求上下文的请求工厂调用的“魔力”,让我大吃一惊。
    【解决方案2】:

    我认为你不能用一个RequestContext 创建一个对象,然后用另一个来编辑它。 所以你可以通过两种方式解决这个问题:

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

    解决方案二可能如下所示:

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

    【讨论】:

    • 谢谢您,Ümit ...您的建议非常完美,我非常感谢您对请求工厂接口如何工作所需的说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多