0

我将 liferay 升级到 6.0,将 JSF 从 1.2 升级到 2.1。我现有的代码

 ((ActionResponse)context.getExternalContext().getResponse()).sendRedirect( redirect );
context.responseComplete();

这里重定向定义如下:

String redirect = "/namingportal/group/customercenter/accountSearch";

上面的 URL 是请求必须重定向到的 portlet 页面。

开始出现错误:java.lang.IllegalStateException: Set render parameter has already been called at com.liferay.portlet.ActionResponseImpl.sendRedirect(ActionResponseImpl.java:48)

在做了一些谷歌之后,我认为上面的代码应该替换为以下代码:

解决方案1:

context.getExternalContext().redirect(redirect);

当我尝试使用解决方案 1 时,它给了我错误 FacesFileNotFound /namingportal/group/customercenter/accountSearch.xhtml,它实际上是在寻找 xhtml 而不是 portlet。

我的 web.xml 中也有这个:

<context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>

请让我知道是否有任何其他替代方法可以使用 Liferay 6.0 和 JSF 2.1 从 JSF 托管 bean 方法重定向到 portlet。

谢谢

4

1 回答 1

3

该桥符合 ExternalContext.redirect(String) 的 JSR 329 规范要求,它提供了实现您想要做的事情的标准方法。

在大多数情况下,桥接器假定 ExternalContext.redirect(String) 是 JSF 导航规则触发的一部分。但是,有两种方法可以使其适用于您的情况:

1) 将 Bridge.DIRECT_LINK 参数添加到值为“true”的 URL:

String redirect = "/namingportal/group/customercenter/accountSearch?javax.portlet.faces.DirectLink=true";
externalContext.redirect(redirect);

2) 将 URL 设为绝对 URL,如下所示:

PortletRequest portletRequest = externalContext.getRequest();
ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute("THEME_DISPLAY");
String portalURL = themeDisplay.getPortalURL();
String redirect = portalURL + "/namingportal/group/customercenter/accountSearch";
externalContext.redirect(redirect);
于 2012-07-06T18:55:56.607 回答