AppEngine データストアで、1 対多の関係を持つ JDO エンティティを使用して、GWT 2.5 で RequestFactory を使用しています (そして初めて使用します)。オブジェクトを表示/編集するために GWT RequestFactoryEditorDriver を使い始めたところです。
ドライバーはオブジェクトをうまく走査し、正しく表示します。ただし、「関連する」オブジェクトの値を編集しようとすると、変更がデータストアに保存されません。
b.name
UIを変更して [保存] をクリックすると、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 に有効なセッターを持っていることを確認する