我试图通过传递一些参数来订购查找液滴API。我假设必须的参数是userId和organisationid,我已经传递了它们,另外我还传递了"state"参数。通过请求传递这些参数,然后调用水滴的服务方法。但是service方法什么也不返回。我的目标是检查这个液滴是否检索到预期的订单集。我们可以使用滴调用器,但我试过,但它没有工作,可能是我错过了什么。请帮帮我!!这是我的代码,当我试图使用OrderLookUp API
DynamoHttpServletRequest request = ServletUtil.getCurrentRequest();
mTestService.setCurrentRequest(request);
if (request == null) {
mTestService.vlogError("Request is null.");
Assert.fail("Request is null ");
}
else
{
Object droplet = mTestService
.getRequestScopedComponent("OrderLookupDroplet");
OrderLookupDroplet=(OrderLookup) droplet;
request.setParameter("state", "submitted");
request.setParameter("organisationIds", organizationIds);
request.setParameter("userId", userId);
ByteBuffer buffer = ByteBuffer.allocate(1024);
DynamoHttpServletRequest dynRequest = (DynamoHttpServletRequest) request;
TestingDynamoHttpServletRequest wrappedRequest = new TestingDynamoHttpServletRequest(
dynRequest, buffer);
TestingDynamoHttpServletResponse wrappedResponce = new TestingDynamoHttpServletResponse(
dynRequest.getResponse());
OrderLookupDroplet.service(wrappedRequest, wrappedResponce);
}
上面的示例只是代码的一部分…
这是我尝试使用液滴调用器
时的代码DropletInvoker invoker = new DropletInvoker(mNucleus);
invoker.getRequest().setParameter("state", "submitted");
// String [] siteIds = {"siteA", "siteB"};
// invoker.getRequest().setParameter("siteIds", Arrays.asList(siteIds));
String [] organizationIds = {"OrgA", "OrgB"};
invoker.getRequest().setParameter("organizationIds", organizationIds);
String [] orderIds = {"orderautouser001OrgA" , "orderautouser001OrgB"};
invokeDroplet(invoker, "autouser001", orderIds);
......
protected void invokeDroplet(DropletInvoker pInvoker, String pUserId, String[] pOrderIds) throws Exception
{
Map<String, Object> localParams = new HashMap();
localParams.put("userId", pUserId);
DropletResult result = pInvoker.invokeDroplet("/atg/commerce/order/OrderLookup", localParams);
RenderedOutputParameter oparam = result.getRenderedOutputParameter("output", 0);
assertNotNull("'output' oparam was not rendered", oparam);
assertEquals("Check totalCount.", pOrderIds.length, oparam.getFrameParameter("totalCount"));
List<Order> orders = (List<Order>)oparam.getFrameParameter("result");
assertEquals("Check order array length.", pOrderIds.length, orders.size());
for (int index = 0; index < pOrderIds.length; index++) {
boolean found = false;
for (Order order: orders) {
if (pOrderIds[index].equals(order.getId())) {
found = true;
break;
}
}
assertTrue("Expected orderId " + pOrderIds[index] + " not found in result array", found);
}
在第一种情况下,我不知道如何通过直接使用orderlookup api....检索订单在第二种情况下,虽然我知道如何使用它,我仍然失败!!
您不应该在java类中使用水滴,它们应该只在jsp页面中使用。这里是OrderLookup的文档以及如何在jsp页面上使用它的示例。
如果你想获得存储在存储库中的订单或任何其他数据,你应该使用带有RQL(存储库查询语言)的存储库API。示例如何从存储库获取数据,您可以在这里找到,RQL语法在这里。
谢谢你的意见。好消息是,我们可以从任何其他API调用液滴
OrderLookup droplet = (OrderLookup) sNucleus.resolveName("/atg/commerce/order/OrderLookup");
ServletTestUtils utils = new ServletTestUtils();
mRequest = utils.createDynamoHttpServletRequestForSession(sNucleus, null, null);
ServletUtil.setCurrentRequest(mRequest);
mResponse = new DynamoHttpServletResponse();
mRequest.setResponse(mResponse);
mResponse.setRequest(mRequest);
mResponse.setResponse(new GenericHttpServletResponse());
mRequest.setParameter("userId", "publishing");
droplet.setSearchByUserId(true);
droplet.service(mRequest, mResponse);
ArrayList<Order> orders = (ArrayList<Order>) mRequest.getObjectParameter("result");
这里的"结果"参数是该液滴设置的输出参数。和userId我已经硬编码为"发布",我已经创建。忽略由我创建的servlettesttils类,它在这里与滴理论没有多大关系:)
从您的代码示例和您提到的DropletInvoker的事实来看,我认为您正在编写单元测试,并且这不是功能代码。
如果它是功能代码,你真的,真的,不应该从另一个Nucleus组件调用一个液滴。水滴只存在于JSP页面中。如果你需要Java代码中droplet的功能,你应该将droplet重构为一个包含主逻辑的服务,以及一个简单地充当服务的中介的droplet,以允许从页面调用它。
在OrderLookup
look水滴的情况下,您不需要重构任何东西。要使用的服务应该是OrderManager
或OrderTools
,这取决于您需要什么。注意,Order对象和Order存储库项之间存在差异,您应该更喜欢使用Order对象—因此,只有在确实需要时才直接使用Order存储库。