2

AppEngine データストアで、1 対多の関係を持つ JDO エンティティを使用して、GWT 2.5 で RequestFactory を使用しています (そして初めて使用します)。オブジェクトを表示/編集するために GWT RequestFactoryEditorDriver を使い始めたところです。

ドライバーはオブジェクトをうまく走査し、正しく表示します。ただし、「関連する」オブジェクトの値を編集しようとすると、変更がデータストアに保存されません。

b.nameUIを変更して [保存] をクリックすると、A のpersist()呼び出しだけが呼び出されていることに気付きます。B の persist() は呼び出されません。ARequest と BRequest の両方のリクエスト コンテキストで editorDriver を起動するにはどうすればよいですか? (私が望んでいるのはInstanceRequest<AProxy,Void> persist()、私の編集が B オブジェクトのみに対するものであるときに B が呼び出されるようにするためです。)

また、AFAICT、BProxy にエディターがある場合、エディターによって表示されている (およびエディター コントラクトに従っている) オブジェクト b は、ドライバーによって自動的に "context.edit(b)" されて変更可能になります。ただし、私の場合、「コンテキスト」は BRequest ではなく ARequest です。

ここで述べたように ValueAwareEditor を作成する必要がありますか: GWT Editor フレームワーク と呼び出し内で新しい BRequest を作成しflush()て起動し、ARequest が起動される前に B への変更が BRequest に個別に保持されるようにしますか?

editorDriver.getPaths()私に与えます:「bs」

editorDriver.isChanged()また、コンテキストを fire() する前に trueを返すため、ドライバーは B のプロパティの変更を確実に認識します。

クライアント側またはサーバー側のログにエラーはなく、注釈プロセッサは警告なしで実行されます。

ドライバーをセットアップする方法は次のとおりです。

editorDriver = GWT.create(Driver.class);
editorDriver.initialize(rf, view.getAEditor());

final ARequest aRequest = rf.ARequest();
        final Request<List<AProxy>> aRequest = aRequest.findAByUser(loginInfo.getUserId());
        String[] paths = editorDriver.getPaths();
        aRequest.with(paths).fire(new Receiver<List<AProxy>>() {

            @Override
            public void onSuccess(List<AProxy> response) {
                AProxy a = response.get(0);
                ARequest aRequest2 = rf.aRequest();
                editorDriver.edit(a, aRequest2);
                aRequest2.persist().using(a);
            }
        });

これは私のエンティティがどのように見えるかです:

public abstract class PersistentEntity {
    public Void persist() {
        PersistenceManager pm = getPersistenceManager();
        try {
            pm.makePersistent(this);
        } finally {
          pm.close();
        }
        return null;
    }


    public Void remove() {
        PersistenceManager pm = getPersistenceManager();
        try {
            pm.deletePersistent(this);
        } finally {
          pm.close();
        }
        return null;
    }
}

@PersistenceCapable(identityType = IdentityType.APPLICATION)
@Version(strategy=VersionStrategy.VERSION_NUMBER, column="VERSION",
         extensions={@Extension(vendorName="datanucleus", key="field-name", value="version")})

public class A extends PersistentEntity {

        ... (Id, version omitted for brevity)
    @Persistent
    private String name;

        @Persistent
        private List<B> bs;

    public String getName() {
        return name;
    }

        ...

    public void setName(String name) {
        this.name = name;
    }

    public List<B> getBs() {
        return bs;
    }

    public void setBs(List<B> bs) {
        this.bs = bs;
    }

}

... (same annotations as above omitted for brevity)

public class B extends PersistentEntity {

        ... (Id, version omitted for brevity)
    @Persistent
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

プロキシは次のとおりです。

@ProxyFor(A.class)
public interface AProxy extends EntityProxy {
    String getName();
    List<BProxy> getBs();
    void setName(String name);
    void setBs(List<BProxy> bs);
}

@ProxyFor(B.class)
public interface BProxy extends EntityProxy {
    String getName();
    void setName(String name);
}

これが私のサービススタブです:

@Service(A.class)
public interface ARequest extends RequestContext {

    Request<List<A>> findAByUser(String userId);

    InstanceRequest<AProxy, Void> persist();
    InstanceRequest<AProxy, Void> remove();
}

@Service(B.class)
public interface BRequest extends RequestContext {

    Request<List<A>> findB(String key);

    InstanceRequest<BProxy, Void> persist();
    InstanceRequest<BProxy, Void> remove();
}

編集: サーバー側で「a」を再帰的に「永続化」できるように、「saveAndReturn」メソッドをサポートするように ARequest インターフェイスとサービスの実装を変更しました。

Request<UserSandboxProxy> saveAndReturn(AProxy aProxy);

RequestFactoryEditorDriver を「フラッシュ」すると、クライアント側のコンテキスト オブジェクトに新しい「b.name」値が含まれていることがわかりました。ただし、「context.fire()」を呼び出してサーバー側で「saveAndReturn」メソッドを検査すると、結果のサーバー側オブジェクト「a」は、「永続化」する直前に、「への変更が含まれていません」 b.name" リストの任意の項目。

なぜこれが起こっているのでしょうか?このクライアント情報がサーバーに送信されない理由をデバッグするにはどうすればよいですか?

私が検討し、試し、除外したオプション:

1) APT が実行され、プロキシまたはサービス インターフェイスに警告/エラーがないことを確認する

2) 私のプロキシがリストの AProxy に有効なセッターを持っていることを確認する

4

1 に答える 1

2

RequestFactoryが正しく機能するには、リクエストごとのセッションパターンを使用する必要があります。詳細はこちら:https ://code.google.com/p/google-web-toolkit/issues/detail?id = 7827

于 2012-12-30T20:18:21.050 に答える