0

liferay を 6.0 に、JSF を 1.2 から 2.1 にアップグレードしました。私の既存のコード

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

ここで、リダイレクトは次のように定義されます。

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

上記の URL は、要求をリダイレクトする必要があるポートレット ページです。

エラーで壊れ始めました: 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 を探しています。

これも私の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 メソッドからポートレットにリダイレクトする別の方法があれば教えてください。

ありがとう

4

1 に答える 1

3

ブリッジは、ExternalContext.redirect(String) の JSR 329 仕様要件に準拠しており、目的を達成するための標準的な方法を提供します。

ほとんどの場合、ExternalContext.redirect(String) は、ブリッジによって、JSF ナビゲーション ルールの起動の一部であると見なされます。ただし、ケースで機能させるには2つの方法があります。

1) Bridge.DIRECT_LINK パラメータを URL に追加し、値を「true」にします。

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

2) 次のように、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 に答える