我在GWT 2.5中使用(和新的)RequestFactory,在AppEngine数据存储上使用具有一对多关系的JDO实体。我刚刚开始使用GWT RequestFactoryEditorDriver来显示/编辑我的对象。
驱动程序遍历我的对象,并正确显示它们。但是,当我尝试编辑“相关”对象上的值时,更改不会持久保存到数据存储区。
当我在用户界面上更改b.name
并点击“保存”时,我注意到只有A的persist()
来电被调用。 B的persist()永远不会被调用。如何让editorDriver同时触发ARequest和BRequest请求上下文? (因为当我的编辑仅针对B对象时,我想要的是调用B的InstanceRequest<AProxy,Void> persist()
。)
另外,AFAICT,如果我有一个关于BProxy的编辑器,编辑器显示的任何对象b(以及编辑合同之后)应该自动成为驱动程序的“context.edit(b)”以使其成为可变的。但是,在我的情况下,“上下文”是一个ARequest,而不是一个BRequest。
我是否必须制作如此处所述的ValueAwareEditor:GWT Editor framework
并在flush()
调用中创建一个新的BRequest并触发它,以便在ARequest被解雇之前,在BRequest中分别保留对B的更改?
editorDriver.getPaths()
给了我:
“BS”
此外,驱动程序肯定会看到对B属性的更改,因为editorDriver.isChanged()
在我触发()上下文之前返回true。
我的客户端或服务器端日志没有错误,并且Annotation Processor在没有警告的情况下运行。
以下是我设置驱动程序的方法:
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();
}
修改: 我现在已经改变了我的ARequest接口和服务实现以支持“saveAndReturn”方法,这样我就可以在服务器端递归“持久化”“a”:
Request<UserSandboxProxy> saveAndReturn(AProxy aProxy);
我现在发现当我“刷新”我的RequestFactoryEditorDriver时,客户端上下文对象具有我的新“b.name”值。但是,如果我在服务器端调用“context.fire()”并检查我的“saveAndReturn”方法,那么在我“持久化”它之前生成的服务器端对象“a”不包含对“ b.name“在列表的任何项目上。
为什么会发生这种情况?我如何调试为什么这个客户端信息没有通过电线连接到服务器?
我考虑,尝试和排除的选项:
1)确保APT已运行,并且代理服务或服务接口上没有警告/错误
2)确保我的代理在AProxy中有一个有效的setter for List
答案 0 :(得分:2)
您 使用Request-Per-request模式让RequestFactory正常工作。更多详情:https://code.google.com/p/google-web-toolkit/issues/detail?id=7827