使用ActionMapping将重定向到另一个Portlet

3

我正在使用Liferay和Spring MVC,并且我想重定向到另一个portlet并传递参数,但是当我尝试设置渲染参数时,我会收到以下错误:

15:20:24,859 ERROR [portal-web.docroot.html.portal.render_portlet_jsp] (http-foo-10.23.243.3-8080-7) java.lang.IllegalStateException: 已经调用了“Set render parameter”

at com.liferay.portlet.ActionResponseImpl.sendRedirect(ActionResponseImpl.java:48) at sk.foo.showcasePortlet.ShowcaseController.redirect(ShowcaseController.java:65)

showcaseController的方法仅包含赋值和重定向操作:

@ActionMapping(params = { "action=redirect" })
public void redirect(ActionRequest request, ActionResponse response) 
    throws IOException {

    response.setRenderParameter("path", request.getParameter("path"));
    response.sendRedirect("/path/to/portlet");
}

为什么我不能分配那个参数?当我删除该行时,重定向可以正常工作,但问题在于用户被重定向到的门户期望一个名为“path”的字符串参数。
@RenderMapping
public String barBaz(RenderRequest request, @RequestParam String path){
    // ...
    return "some/jsp";
}

请问如何将参数传递到另一个portlet中的barBaz方法?

1个回答

3
你的异常提示为:IllegalStateException: Set render parameter has already been called。
请注意,这个拦截器在ActionResponse上调用了setRenderParameter,这意味着当你使用这个拦截器时,你不能在处理程序中调用sendRedirect。如果你需要进行外部重定向,那么你要么需要手动转发映射参数,要么编写不同的拦截器来处理此问题。 DOC

如果我使用response.setProperty("path", "somePath")传递参数,那么另一个Portlet是否能够通过request.getProperty("path")接收到它呢?(如果它不是@RequestParam) - Dropout
不,你不能这样做。实际上,属性可以被端口提供商用来向门户提供特定的信息。这些属性因门户服务器供应商而异。使用会话的简单方法是通过 session 对象调用 request.getSession()。您可以在 session 对象上设置属性。session.setAttribute("portletscopeattribute", "portletscopevalue", PortletSession.PORTLET_SCOPE); 此外,您还可以使用事件。 - Asif Bhutto
我会使用会话。非常感谢! - Dropout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接