我正在尝试在我的应用程序中实现 RequestFactory 和 Editor 框架。即使在研究了论坛、谷歌开发者论坛和其他论坛之后,我也发现对于将 RequestContext 与 RequestFactory 一起使用,我不了解一些基本的东西。这是我的场景:
我有一个简单的实体,它具有三个字段,id、版本、描述,称为 CmsObjectType。我的 CRUD 操作有一个相应的 EntityProxy 和一个 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 调用编辑,我会收到一条错误消息,指出上下文已经在进行中。如果我为 foundProxy 创建一个局部变量,然后尝试使用 RequestContext 的新实例来调用 requestContext。在新找到的实体上编辑(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 的精彩描述
谷歌文档 任何帮助将不胜感激。谢谢!