我正在尝试将 RequestFactory 和编辑器框架实现到我的应用程序中。即使在研究了论坛、Google 开发者论坛和其他论坛之后,我仍然发现,关于将 RequestContext 与 RequestFactory 一起使用,我仍然不明白一些基本的东西。这是我的场景:
我有一个简单的实体,它具有三个字段,id、版本、描述,称为 CmsObjectType。我有一个相应的 EntityProxy 和一个带有 CRUD 操作的 CmsObjectTypeServiceDAO。我还实现了 ServiceLocator 和 ObjectLocator 类。这段代码全部编译并运行。
我还使用以下命令创建了一个简单的测试用例来测试 CRUD 操作:
public class RequestFactoryProvider {
public static CmsRequestFactory get() {
SimpleEventBus eventBus = new SimpleEventBus();
CmsRequestFactory requestFactory = RequestFactoryMagic.create(CmsRequestFactory.class);
ServiceLayer serviceLayer = ServiceLayer.create();
SimpleRequestProcessor processor = new SimpleRequestProcessor(
serviceLayer);
requestFactory.initialize(eventBus, new InProcessRequestTransport(
processor));
return requestFactory;
}
}
考试:
public class TestCmsObjectTypeRequest extends Assert {
private static CmsRequestFactory requestFactory;
private static CmsObjectTypeRequestContext objectTypeRequest;
private Long newId;
@Before
public void setUp() {
requestFactory = RequestFactoryProvider.get();
objectTypeRequest = requestFactory.objectTypeRequest();
}
@Test
public void testEdit() {
final CmsObjectTypeProxy newType = objectTypeRequest
.create(CmsObjectTypeProxy.class);
newType.setDescription("NEW TYPE");
objectTypeRequest.persist(newType).to(new Receiver<Long>() {
@Override
public void onSuccess(Long response) {
if (response != null) {
newId = response;
assertTrue(true);
} else {
fail();
}
}
@Override
public void onFailure(ServerFailure error) {
fail();
}
});
// Edit the newly created object
newType.setDescription("EDITED NEW TYPE");
objectTypeRequest.update(newType).to(new Receiver<Boolean>() {
@Override
public void onSuccess(Boolean response) {
assertTrue(response);
}
@Override
public void onFailure(ServerFailure error) {
fail();
}
});
//Remove it when we're done..
objectTypeRequest.delete(newType).to(new Receiver<Boolean>() {
@Override
public void onSuccess(Boolean response) {
System.out.println("onSuccess from delete.");
assertTrue(response);
}
@Override
public void onFailure(ServerFailure error) {
fail();
}
});
objectTypeRequest.fire();
}
}
当我创建一个新的请求上下文并链接创建、更新和删除的方法调用,然后调用 fire() 时,它在上面的测试中没有任何问题。但是,如果我尝试通过调用该方法然后调用 fire() 来单独执行这些调用,我会遇到问题。我可以调用 create() ,让接收者返回新创建的实体的 id,然后使用该 id 调用 find(id) 并取回新创建的实体。到目前为止一切正常。然而,这就是我感到困惑的地方..如果我尝试从 find(id) 的接收器的 onSuccess() 方法中使用当前的 RequestContext 调用编辑,我会收到一条错误消息,指出上下文已经在进行中。如果我为 findProxy 创建一个局部变量,然后尝试使用 RequestContext 的新实例在新找到的实体上调用 requestContext.edit(foundProxy) ,然后调用 update() ,我会收到服务器错误,最常见的是:服务器错误:请求的实体在服务器上不可用。如果我不创建请求上下文的新实例,我会收到一个 IllegalStateException ,表示请求已在进行中。
这是示例测试,希望能让这一点更清楚:
@Test
public void testEditWOChaining() {
final CmsObjectTypeProxy newType = objectTypeRequest
.create(CmsObjectTypeProxy.class);
newType.setDescription("NEW TYPE");
objectTypeRequest.persist(newType).to(new Receiver<Long>() {
@Override
public void onSuccess(Long response) {
if (response != null) {
setNewId(response);
assertTrue(true);
} else {
fail();
}
}
@Override
public void onFailure(ServerFailure error) {
fail();
}
}).fire();
if (newId != null) {
objectTypeRequest = requestFactory.objectTypeRequest();
objectTypeRequest.find(newId)
.to(new Receiver<CmsObjectTypeProxy>() {
@Override
public void onSuccess(CmsObjectTypeProxy response) {
if (response != null) {
foundProxy = response;
}
}
@Override
public void onFailure(ServerFailure error) {
fail();
}
}).fire();
}
if (foundProxy != null) {
// Edit the newly created object
objectTypeRequest = requestFactory.objectTypeRequest();
CmsObjectTypeProxy editableProxy = objectTypeRequest
.edit(foundProxy);
editableProxy.setDescription("EDITED NEW TYPE");
objectTypeRequest.update(editableProxy).to(new Receiver<Boolean>() {
@Override
public void onSuccess(Boolean response) {
assertTrue(response);
}
@Override
public void onFailure(ServerFailure error) {
fail();
}
}).fire();
}
// Remove it when we're done..
objectTypeRequest.delete(foundProxy).to(new Receiver<Boolean>() {
@Override
public void onSuccess(Boolean response) {
System.out.println("onSuccess from delete.");
assertTrue(response);
}
@Override
public void onFailure(ServerFailure error) {
fail();
}
});
objectTypeRequest.fire();
}
这是我的问题.. 如果编辑不与 create() 关联而是与 find() 关联,那么处理编辑的最佳方法是什么?如果我尝试将查找与更新链接起来,我的foundProxy 为空并且内容不会更新。代理是否必须与创建它们的上下文保持绑定才能对其执行更新?如果有人可以解释这是如何工作的或向我指出一些文件来指出我所缺少的内容,我将不胜感激。这是否可能与测试框架处理请求的方式有关?
我已阅读以下内容,因此如果我错过了其中的某些内容,请告诉我:tbroyer 的精彩描述 http://tbroyer.posterous.com/gwt-211-requestfactory
谷歌文档 http://code.google.com/webtoolkit/doc/latest/DevGuideRequestFactory.html任何帮助将不胜感激。谢谢你!