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. 繰り返しますが、newを作成しますorgRequestContext()(の各呼び出しがの新しいインスタンスをgetRequestFactory().orgRequestContext()提供するため)orgRequestContext()

  2. 「エディターとそのサブエディターをデータで駆動し始めます。」ドキュメントが言うように。ただし、その一部として、passedを使用して渡されたインスタンスorgRequestContext()を編集しIOrgProxy、プロキシを編集できるようにします。

  3. プロキシは他のRequestContextによって作成されたときにすでに編集されているため、例外が発生します。RequestFactoryには基本的なルールがあり、そのプロキシは1つのRequestContextによってのみ編集できます。

    このスレッドも参照してください。

于 2012-10-18T07:10:56.533 に答える
1

RequestContextあるオブジェクトでオブジェクトを作成してから、別のオブジェクトで編集することはできないと思います。したがって、これは2つの方法で解決できます。

  • 作成したオブジェクトを、オブジェクトのRequestContext作成時に使用したもので永続化します。saveメソッドは永続化されたオブジェクトを返す必要があり、この永続化されたオブジェクトは新しい新しいオブジェクトでエディターに渡すことができますRequestContext
  • オブジェクトの作成に使用したものをどこかに保存し、それをあなたの関数にRequestContext渡しますeditDriver

解決策2は次のようになります。

@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 に答える