2014-01-25 98 views
0

我想通过使用下面的代码来调用使用DUST的DropletInvoker的RQLQueryForEach小滴。DropletInvoker.invokeDroplet无法识别的请求参数

HeadPipelineServlet dynamoHandler = (HeadPipelineServlet) Nucleus.getGlobalNucleus().resolveName("/atg/dynamo/servlet/dafpipeline/DynamoHandler"); 
DynamoHttpServletRequest request = dynamoHandler.getRequest(null); 

ByteBuffer buffer = ByteBuffer.allocate(1024); 
TestingDynamoHttpServletRequest wrappedRequest = new TestingDynamoHttpServletRequest(request, buffer); 
TestingDynamoHttpServletResponse wrappedResponce = new TestingDynamoHttpServletResponse(request.getResponse()); 

DynamoServlet droplet = (DynamoServlet) wrappedRequest.resolveName("/atg/dynamo/droplet/RQLQueryForEach"); 

wrappedRequest.setParameter("repository", "/atg/userprofiling/ProfileAdapterRepository"); 
wrappedRequest.setParameter("itemDescriptor", "user"); 
wrappedRequest.setParameter("transactionManager", "/atg/dynamo/transaction/TransactionManager"); 
wrappedRequest.setParameter("queryRQL", "ALL"); 

DropletInvoker mDropletInvoker = new DropletInvoker(Nucleus.getGlobalNucleus()); 
DropletResult result = mDropletInvoker.invokeDroplet(droplet, null, wrappedRequest, wrappedResponce); 

assertNotNull("Check that output got rendered",result.getRenderedOutputParameter("output")); 

invokeDroplet方法与异常失败“javax.servlet.ServletException:必备参数‘仓库’不会传递到滴。”任何一个人都可以指向正确的方向,我做错了什么?

以下是完整的堆栈跟踪...

javax.servlet.ServletException: required parameter 'repository' not passed to droplet 
    at atg.repository.servlet.RQLQueryForEach.getRangeResults(RQLQueryForEach.java:254) 
    at atg.repository.servlet.RQLQueryForEach.getResults(RQLQueryForEach.java:220) 
    at atg.repository.servlet.RQLQueryForEach.service(RQLQueryForEach.java:179) 
    at atg.servlet.DynamoServlet.service(DynamoServlet.java:152) 

我可以使用额外的参数解决问题。但是,我仍然无法弄清楚为什么我原来的代码不工作。

解决方法,我发现

HeadPipelineServlet dynamoHandler = (HeadPipelineServlet) Nucleus.getGlobalNucleus().resolveName("/atg/dynamo/servlet/dafpipeline/DynamoHandler"); 
Map<String,Object> additionalParams = new HashMap<>(); 
additionalParams.put("repository", "/atg/userprofiling/ProfileAdapterRepository"); 
additionalParams.put("itemDescriptor", "user"); 
additionalParams.put("queryRQL", "ALL"); 
DropletInvoker mDropletInvoker = new DropletInvoker(Nucleus.getGlobalNucleus()); 
DropletResult result = mDropletInvoker.invokeDroplet("/atg/dynamo/droplet/RQLQueryForEach",additionalParams); 

回答

0

你正确地构建你的尘土代码?该错误仅表明输入参数repository未在请求中发送。

有没有一点,当下面的行不在你的代码。如果您添加了它,可能您的更改尚未建立。你能清理你的项目,然后再试一次。除此之外,我没有看到你的代码有任何问题。另外,如果您使用的是Eclipse,可能您的Build Automatically在“项目”菜单下未被选中。

wrappedRequest.setParameter("repository", "/atg/userprofiling/ProfileAdapterRepository"); 
+0

不建设不是问题。我甚至在这个setParameter之后写了一个sysout,并且做了一个getParameter,它导致打印我放入的存储库值。所以,代码正在建立。 – Buddha

+0

好的,你可以尝试使用'ServletTestUtil.createDynamoRequest(params,buffer,method)' 如http://atgdust.sourceforge.net/servlet-test.html 可能你设置参数的方式不是正确的一个。 – boyintello

+0

我的方式可能并不正确。我会阅读这个页面并给出一个镜头。但是,我发现了一个使用invokeDroplet的additionalParameters属性传递参数的解决方法。 – Buddha